夜中に寝れなくなって、なんとなく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                                       **一度もログインしていません**