読者です 読者をやめる 読者になる 読者になる

sonickun.log

備忘録

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

 

SIP

 SIPに関しては,とくに何もしなくてもNmapで検出されなかったのでそのまま.
 

変更後のスキャン結果

$ 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の検知を回避することができた.めでたしめでたし.