Dionaeaを改変してNmapによる検出を回避する
Dionaeaは低対話型のハニーポットであり,本物"そっくり"のサービスをエミュレートするため,本物とはわずかに異なる挙動を取ることがある.有名なネットワークスキャンツールであるNmapはそういったわずかな挙動の違いを突いてハニーポットを検出することができる.以下のようにNmapに-sV
や-A
オプションを付けてスキャンを行うとDionaeaが検出される.
$ nmap -sS -sV AAA.BBB.CCC.DDD Starting Nmap 6.46 ( http://nmap.org ) at 2015-01-30 07:08 Asi Nmap scan report for ec2-AAA-BBB-CCC-DDD.us-west-2.compute.amazonaws.com (AAA.BBB.CCC.DDD) Host is up (0.31s latency). Not shown: 988 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp Dionaea honeypot ftpd 22/tcp open ssh OpenSSH 5.3 (protocol 2.0) 42/tcp open tcpwrapped 80/tcp open http 111/tcp open rpcbind 2-4 (RPC #100000) 135/tcp open msrpc ? 443/tcp open ssl/https ? 445/tcp open microsoft-ds Dionaea honeypot smbd 1433/tcp open ms-sql-s Dionaea honeypot MS-SQL server 3306/tcp open mysql MySQL 5.0.54 5060/tcp open sip (SIP end point; Status: 200 OK) 5061/tcp open ssl/sip-tls ?
攻撃者に自分がハニーポットであることがばれてしまうと,攻撃者がそれ以降の攻撃をやめてしまうという問題がある.そこでDionaeaのソースコードを改変して挙動を調整し,Nmapによる検出を回避する.
まずは,NmapがどのようにしてDionaeaを検出しているかを調査する.Nmapはハニーポット特有の挙動を示すシグネチャを保持しており,スキャンの結果とシグネチャを比較してハニーポットを検出する.そのシグネチャが収められているファイル(nmap-service-probes)を以下のURLからダウンロードしてくる.
$ cat nmap-service-probes |grep -i dionaea match ftp m|^220 Welcome to the ftp service\r\n| p/Dionaea honeypot ftpd/ match http m|^HTTP/1\.0 200 OK\r\nContent-type: text/html; charset=utf-8\r\nContent-Length: 204\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 3\.2 Final//EN\"><html>\n<title>Directory listing for /</title>\n<body>\n<h2>Directory listing for /</h2>\n<hr>\n<ul>\n<li><a href=\"\.\./\">\.\./</a>\n</ul>\n<hr>\n</body>\n</html>\n$| p/Dionaea honeypot httpd/ match microsoft-ds m|^\0...\xffSMBr\0\0\0\0\x98\x01\x40\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\x40\x06\0\0\x01\0\x11\x07\0\x03\x01\0\x01\0\0\x10\0\0\0\0\x01\0\0\0\0\0\xfd\xe3\0\0..........\x00\x34\0W\0O\0R\0K\0G\0R\0O\0U\0P\0\0\0H\0O\0M\0E\0U\0S\0E\0R\0-\0.\0.\0.\0.\0.\0.\0\0\0|s p/Dionaea honeypot smbd/ match honeypot m|^HTTP/1\.0 200 OK\r\nAllow: OPTIONS, GET, HEAD, POST\r\nContent-Length: 0\r\nConnection: close\r\n\r\n| p/Dionaea Honeypot httpd/ match honeypot m|^SIP/2\.0 200 OK\r\nContent-Length: 0\r\nVia: SIP/2\.0/TCP nm;branch=foo\r\nFrom: sip:nm@nm;tag=root\r\nAccept: application/sdp\r\nTo: sip:nm2@nm2\r\nContact: sip:nm2@nm2\r\nCSeq: 42 OPTIONS\r\nAllow: REGISTER, OPTIONS, INVITE, CANCEL, BYE, ACK\r\nCall-ID: 50000\r\nAccept-Language: en\r\n\r\n| p/Dionaea Honeypot sipd/ match ms-sql-s m|^\x04\x01\x00\x2b\x00\x00\x00\x00\x00\x00\x1a\x00\x06\x01\x00\x20\x00\x01\x02\x00\x21\x00\x01\x03\x00\x22\x00\x00\x04\x00\x22\x00\x01\xff\x08\x00\x02\x10\x00\x00\x02\x00\x00| p/Dionaea honeypot MS-SQL server/
NmapはDioneaで動作するサービスのうち,FTP, HTTP, SMB, MSSQL, SIPについてのシグネチャを持っていた.それぞれに対して対策を行う.
FTP
FTPでは,FTP接続時に表示される"220 Welcome to the ftp service"というバナーの文字列のみをチェックしている模様.このバナーを既存のFTPサーバ(今回はMicrosoft FTP)の中から適当なものを選び書き換えると良い.具体的には/opt/dionaea/lib/dionaea/python/dionaea/ftp.py
の227行目を以下のように変更する.
self.reply(WELCOME_MSG, "Welcome to the ftp service") ↓ self.reply(WELCOME_MSG, "Microsoft FTP Service")
HTTP
HTTPでは,HTTPヘッダーとHTMLのソースコードをチェックしている模様.Dionaeaの/opt/dionaea/var/dionaea/wwwroot
下にindex.htmlを置いておくと80番ポートに接続した際にこのページが表示されることになっている.適当にHTMLファイルを置いてさえすればNmapの検出は回避することができるのであとはお好みで.
SMB
SMBの"SMB Negotiate Protocol Response"に含まれる"OemDomainName"と"ServerName"の値をチェックしているようなので,/opt/dionaea/lib/dionaea/python/dionaea/smb/include/smbfields.py
の690行目と693行目を次のように変更する.
ConditionalField(UnicodeNullField("OemDomainName ", "WORKGROUP"), lambdax: not x.Capabilities & CAP_EXTENDED_SECURITY), ConditionalField(UnicodeNullField("ServerName ", "HOMEUSER-3AF6FE"), lambda x: not x.Capabilities & CAP_EXTENDED_SECURITY), ↓ ConditionalField(UnicodeNullField("OemDomainName ", "MIDOMINIO"), lambdax: not x.Capabilities & CAP_EXTENDED_SECURITY), ConditionalField(UnicodeNullField("ServerName ", "EQUIPO-TEST"), lambda x: not x.Capabilities & CAP_EXTENDED_SECURITY),
MSSQL
MSSQLデータベースに接続する際のpre-login TDS package (Tabular Data Streams)の情報をチェックしている模様.Token Typeの値が0x00になっているので,これを0x01に変更する./opt/dionaea/lib/dionaea/python/dionaea/mssql/mssql.py
の151行目を次のように書き換える.
r.VersionToken.TokenType = 0x00 ↓ r.VersionToken.TokenType = 0x01
変更後のスキャン結果
$ nmap -sS -sV AAA.BBB.CCC.DDD Starting Nmap 6.46 ( http://nmap.org ) at 2015-01-30 07:32 Asi Nmap scan report for ec2-AAA-BBB-CCC-DDD.us-west-2.compute.amazonaws.com (AAA.BBB.CCC.DDD) Host is up (0.12s latency). Not shown: 988 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp Microsoft ftpd 22/tcp open ssh OpenSSH 5.3 (protocol 2.0) 42/tcp open tcpwrapped 80/tcp open http ? 111/tcp open rpcbind 2-4 (RPC #100000) 135/tcp open msrpc ? 443/tcp open ssl/https ? 445/tcp open microsoft-ds ? 1433/tcp open ms-sql-s ? 3306/tcp open mysql MySQL 5.0.54 5060/tcp open sip (SIP end point; Status: 200 OK) 5061/tcp open ssl/sip-tls ?
これにてNmapによるDionaeaの検知を回避することができた.めでたしめでたし.