夜中に寝れなくなって、なんとなくlastコマンド、lastbコマンドのログ改ざんできないんかなと思っていじってたところ、root権限があれば、utmpdumpで一度テキストに変換してから再度バイナリファイルに変換することで簡単に改ざんできてしまったので、備忘として残しておく。
utmpdumpコマンド自体はCentOS 7やUbuntu Server 16.04 LTSであれば最初からインストールされているはずなので、まずは以下のコマンドでwtmp、btmpをバイナリからテキストにエクスポートする。
utmpdump /var/log/wtmp > ~/wtmp.txt
[root@BS-PUB-WEBTOOL-TEST01 ~]# utmpdump /var/log/wtmp
Utmp dump of /var/log/wtmp/
[2] [00000] [~~ ] [reboot ] [~ ] [3.10.0-327.el7.x86_64] [0.0.0.0 ] [土 2月 20 23:03:43 2016 ]
[5] [00635] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [土 2月 20 23:03:57 2016 ]
[6] [00635] [tty1] [LOGIN ] [tty1 ] [ ] [0.0.0.0 ] [土 2月 20 23:03:57 2016 ]
[1] [00051] [~~ ] [runlevel] [~ ] [3.10.0-327.el7.x86_64] [0.0.0.0 ] [土 2月 20 23:04:03 2016 ]
[7] [00635] [tty1] [root ] [tty1 ] [ ] [0.0.0.0 ] [日 2月 21 13:26:41 2016 ]
[8] [00635] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [日 2月 21 13:27:22 2016 ]
…
[root@BS-PUB-WEBTOOL-TEST01 ~]# utmpdump /var/log/wtmp > ~/wtmp.txt
Utmp dump of /var/log/wtmp
テキストにエクスポートしたwtmpログを改ざん(とりあえず、今回は直近のログをざっくり削除)したら、以下のコマンドでwtmpログを改ざんした内容に置き換える。
utmpdump --reverse ~/wtmp.txt > /var/log/wtmp
[root@BS-PUB-WEBTOOL-TEST01 ~]# last | head -10
<span style="color: #ff0000;">root pts/2 192.168.10.210 Mon Jun 5 00:08 still logged in
root pts/1 192.168.10.210 Sun Jun 4 17:26 still logged in
root pts/0 192.168.10.210 Sat May 20 15:55 still logged in
root pts/1 172.20.100.118 Sat Apr 8 22:50 - 23:03 (00:12)
root pts/1 172.20.100.118 Sat Apr 8 21:33 - 21:35 (00:01)
root pts/0 192.168.10.210 Sat Apr 8 21:21 - 23:15 (01:54)</span>
root pts/0 192.168.10.210 Tue Mar 14 22:21 - 22:21 (00:00)
reboot system boot 3.10.0-514.10.2. Sat Mar 4 19:02 - 06:06 (93+11:03)
root pts/1 192.168.10.210 Mon Oct 31 08:05 - down (00:37)
root pts/0 192.168.10.210 Mon Oct 31 07:51 - down (00:50)
[root@BS-PUB-WEBTOOL-TEST01 ~]# utmpdump --reverse ~/wtmp.txt > /var/log/wtmp
Utmp undump of /root/wtmp.txt
[root@BS-PUB-WEBTOOL-TEST01 ~]# last | head -10
root pts/0 192.168.10.210 Tue Mar 14 22:21 - 22:21 (00:00)
reboot system boot 3.10.0-514.10.2. Sat Mar 4 19:02 - 06:06 (93+11:03)
root pts/1 192.168.10.210 Mon Oct 31 08:05 - down (00:37)
root pts/0 192.168.10.210 Mon Oct 31 07:51 - down (00:50)
reboot system boot 3.10.0-327.el7.x Mon Oct 31 07:50 - 08:42 (00:52)
root tty1 Sat Jul 30 11:38 - 11:39 (00:01)
reboot system boot 3.10.0-327.el7.x Sat Jul 30 11:34 - 08:42 (92+21:08)
root tty1 Sun Feb 28 22:36 - 22:38 (00:01)
reboot system boot 3.10.0-327.el7.x Sun Feb 28 20:33 - 14:34 (63+18:00)
root pts/1 192.168.10.150 Sun Feb 21 13:35 - 13:35 (00:00)
想定どおり、lastコマンドで閲覧できる内容が改ざんできた。 lastbコマンド(ログインの失敗履歴)についても同様のことができる。 改ざんには基本的にroot権限が必要なので、まぁあまり気にする必要も無いかなと思うけど、確認時はlastコマンドだけじゃなくてlastlogとでも確認するとか、/var/log/secureをちゃんとsyslogサーバに飛ばして監視するとか、SELinuxやら拡張属性の設定するとか、何かしらの対応をしたほうが良いよねと思った。
(そもそも、書き込み権限さえあれば以下のようにログの中身を空にできるので…)
[root@BS-PUB-WEBTOOL-TEST01 ~]# echo '' > /var/log/wtmp
[root@BS-PUB-WEBTOOL-TEST01 ~]# last
wtmp begins Tue Jun 6 06:13:01 2017
[root@BS-PUB-WEBTOOL-TEST01 ~]# echo '' > /var/log/btmp
[root@BS-PUB-WEBTOOL-TEST01 ~]# lastb
btmp begins Tue Jun 6 06:21:45 2017
[root@BS-PUB-WEBTOOL-TEST01 ~]# echo '' > /var/log/lastlog
[root@BS-PUB-WEBTOOL-TEST01 ~]# lastlog
ユーザ名 ポート 場所 最近のログイン
root **一度もログインしていません**
bin **一度もログインしていません**
daemon **一度もログインしていません**
adm **一度もログインしていません**
lp **一度もログインしていません**
sync **一度もログインしていません**
shutdown **一度もログインしていません**
halt **一度もログインしていません**
mail **一度もログインしていません**
operator **一度もログインしていません**
games **一度もログインしていません**
ftp **一度もログインしていません**
nobody **一度もログインしていません**
avahi-autoipd **一度もログインしていません**
systemd-bus-proxy **一度もログインしていません**
systemd-network **一度もログインしていません**
dbus **一度もログインしていません**
polkitd **一度もログインしていません**
tss **一度もログインしていません**
postfix **一度もログインしていません**
sshd **一度もログインしていません**