Un1x Syslog Knowledge for Kids by:ev1lut10n I guess all of u know what syslog is. this syslog is a standart utility under most unix that will log any messages of a program. Most sysadmin can read this log at /var/log/syslog ex: ========== root@ev1l:/home/ev1lut10n# tail -n 10 /var/log/syslog Oct 1 04:39:01 ev1lut10n-Vostro1310 CRON[9609]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete) Oct 1 04:46:19 ev1lut10n-Vostro1310 dhclient: DHCPREQUEST of ****ip censored***** on eth0 to 10.255.9.48 port 67 Oct 1 04:46:19 ev1lut10n-Vostro1310 dhclient: DHCPACK of ****ip censored***** from 10.255.9.48 Oct 1 04:46:19 ev1lut10n-Vostro1310 dhclient: bound to ****ip censored***** -- renewal in 742 seconds. Oct 1 04:58:41 ev1lut10n-Vostro1310 dhclient: DHCPREQUEST of ****ip censored***** on eth0 to 10.255.9.48 port 67 Oct 1 04:58:41 ev1lut10n-Vostro1310 dhclient: DHCPACK of ****ip censored***** from 10.255.9.48 Oct 1 04:58:41 ev1lut10n-Vostro1310 dhclient: bound to ****ip censored***** -- renewal in 425 seconds. Oct 1 05:05:46 ev1lut10n-Vostro1310 dhclient: DHCPREQUEST of ****ip censored***** on eth0 to 10.255.9.48 port 67 Oct 1 05:05:46 ev1lut10n-Vostro1310 dhclient: DHCPACK of ****ip censored***** from 10.255.9.48 Oct 1 05:05:46 ev1lut10n-Vostro1310 dhclient: bound to ****ip censored***** -- renewal in 882 seconds. ========== below are some various c operation related to syslog: - openlog - syslog - closelog exactly when we need to do a syslog there will be something called priority as we can see on /usr/include/sys/syslog.h (on my box) : ======= CODE prioritynames[] = { { "alert", LOG_ALERT }, { "crit", LOG_CRIT }, { "debug", LOG_DEBUG }, { "emerg", LOG_EMERG }, { "err", LOG_ERR }, { "error", LOG_ERR }, /* DEPRECATED */ { "info", LOG_INFO }, { "none", INTERNAL_NOPRI }, /* INTERNAL */ { "notice", LOG_NOTICE }, { "panic", LOG_EMERG }, /* DEPRECATED */ { "warn", LOG_WARNING }, /* DEPRECATED */ { "warning", LOG_WARNING }, { NULL, -1 } }; ====== desc: LOG_EMERG = system unusable LOG_ALERT = need a fast action LOG_CRITICAL = critical condition (in some online game, ex: Ran Online : critical damage ;-p ) LOG_INFO = informational message and so on ... (sorry I'm lazy just googling for more info about the priorities) below is a sample c code using syslog function that will log our message ============== root@ev1l:/home/ev1lut10n/c# cat syslog.c #include <stdio.h> #include <sys/syslog.h> int main() { /**first we open log**/ openlog("slog", LOG_PID|LOG_CONS, LOG_USER); /**the we do our syslog**/ syslog(LOG_INFO, "We are script kiddies ! we have owned your box ! hahahahaha"); /**then we need to close the log**/ closelog(); } root@ev1l:/home/ev1lut10n/c# gcc -o syslog syslog.c root@ev1l:/home/ev1lut10n/c# ./syslog root@ev1l:/home/ev1lut10n/c# tail -n 1 /var/log/syslog Oct 1 05:26:24 ev1lut10n-Vostro1310 slog[10730]: We are script kiddies ! we have owned your box ! hahahahaha ============== these messages actually logged by the syslogd ================== root@ev1l:/home/ev1lut10n# ps aux | grep syslog syslog 830 0.0 0.0 34608 1272 ? Sl 00:58 0:00 rsyslogd -c4 root@ev1l:/home/ev1lut10n/c# kill -9 830 root@ev1l:/home/ev1lut10n/c# ./syslog ================== then there will be no more syslog logging: ============ root@ev1l:/home/ev1lut10n/c# tail /var/log/syslog Oct 1 05:20:28 mywisdom-Vostro1310 dhclient: DHCPACK of 139.195.54.157 from 10.255.9.48 Oct 1 05:20:28 mywisdom-Vostro1310 dhclient: bound to 139.195.54.157 -- renewal in 693 seconds. Oct 1 05:25:30 mywisdom-Vostro1310 slog[10701]: #012We are script kiddies ! we have owned your box ! hahahahaha Oct 1 05:26:24 mywisdom-Vostro1310 slog[10730]: We are script kiddies ! we have owned your box ! hahahahaha Oct 1 05:27:19 ev1l kernel: imklog 4.2.0, log source = /proc/kmsg started. Oct 1 05:27:19 ev1l rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="10747" x-info="http://www.rsyslog.com"] (re)start Oct 1 05:27:19 ev1l rsyslogd: rsyslogd's groupid changed to 103 Oct 1 05:27:19 ev1l rsyslogd: rsyslogd's userid changed to 101 Oct 1 05:27:19 ev1l rsyslogd-2039: Could no open output file '/dev/xconsole' [try http://www.rsyslog.com/e/2039 ] Oct 1 05:27:22 ev1l slog[10751]: We are script kiddies ! we have owned your box ! hahahahaha ============= [Wrong Usage of Syslog resulted a Format String Bug] ok wrong usage of this syslog is very dangerous start the syslogd again: ===================== root@ev1l:/home/ev1lut10n/c# locate rsyslogd /usr/sbin/rsyslogd /usr/share/man/man8/rsyslogd.8.gz root@ev1l:/home/ev1lut10n/c# /usr/sbin/rsyslogd Already running. root@ev1l:/home/ev1lut10n/c# ps aux | grep syslog mywisdom 1628 4.1 0.5 163672 11412 ? S<sl 00:58 11:20 /usr/bin/pulseaudio --start --log-target=syslog syslog 10747 0.0 0.0 33452 1308 ? Sl 05:27 0:00 rsyslogd -c4 root@ev1l:/home/ev1lut10n/c# ./syslog root@ev1l:/home/ev1lut10n/c# tail -n 2 /var/log/messages Oct 1 05:27:22 ev1l slog[10751]: We are script kiddies ! we have owned your box ! hahahahaha Oct 1 05:32:02 ev1l slog[10830]: We are script kiddies ! we have owned your box ! hahahahaha ====================== all c programmers must not forget to specify the format string when he use a variable as a parameter into syslog function this is a sample of a code with format string bug when we use syslog function: filename: buggy.c ============== root@ev1l:/home/ev1lut10n/c# cat buggy.c #include <stdio.h> #include <sys/syslog.h> int main(int argc,char **argv) { syslog(LOG_INFO,argv[1]); } ============== assemble -> linke and then test it ! =========== root@ev1l:/home/ev1lut10n/c# gcc -o buggy_syslog buggy_syslog.c buggy_syslog.c: In function 'main': buggy_syslog.c:9: warning: passing argument 2 of 'syslog' makes pointer from integer without a cast root@ev1l:/home/ev1lut10n/c# ls buggy_syslog buggy_syslog.c ev1syn ev1syn.c syslog syslog.c root@ev1l:/home/ev1lut10n/c# ./buggy %x root@ev1l:/home/ev1lut10n/c# tail -n 1 /var/log/syslog Oct 1 05:47:48 ev1l buggy: 804840b =========== as u can see the syslog messsage logged a memory addr from our stack. Here is sample of correct usage of this fvck syslog: ============= root@ev1l:/home/ev1lut10n/c# cat sys.c #include <stdio.h> #include <sys/syslog.h> int main(int argc,char **argv) { syslog(LOG_INFO,"%s",argv[1]); } =============== here's the correct one should be: =============================== root@ev1l:/home/ev1lut10n/c# gcc -o sys sys.c root@ev1l:/home/ev1lut10n/c# ./sys %x root@ev1l:/home/ev1lut10n/c# tail -n 1 /var/log/syslog Oct 1 05:50:39 ev1l sys: %x ===============================