『壹』 linux exec使用方法,求解
函數原型 int execlp(const char *file, const char *arg, ...);
#include<unistd.h>
#include<stdio.h>
int main(void)
{
if( ( execlp("ls","-a","/", NULL) ) < 0) /*參數錯誤,根據原型來看,file的位置應該是你要的ls*/
{
printf("exec error\n");
exit(1);
}
return 0;
}
『貳』 linux中,進程創建與載入新進程映像是
在子進程的虛擬地址空間里載入新的映像,需要使用系統提供的一系列函數:
.png
他們的作用都是執行一個文件,當我們創建了一個進程之後,通常將子進程替換成新的進程映象,這可以用exec系列的函數來進行。當然,exec系列的函數也可以將當前進程替換掉。例如:在shell命令行執行ps命令,實際上是shell進程調用fork復制一個新的子進程,在利用exec系統調用將新產生的子進程完全替換成ps進程。
exec系列函數(execl、execlp、execle、execv、execvp)包含頭文件
功能:
用exec函數可以把當前進程替換為一個新進程,且新進程與原進程有相同的PID。exec名下是由多個關聯函數組成的一個完整系列,
『叄』 linux下exec 函數第一個參數和第二個參數的區別
哪裡寫的這些...好亂阿..
先解釋下基本的:
int main(argc,char * argv[])
main的參數,就是命令行參數.
比如你的可執行文件是test,你希望在程序執行時傳入IP地址,那麼可以這樣:
./test 127.0.0.1
此時,argc =1,argv[1]是就是指向"127.0.0.1"指針(命令參數全部當作字元串來處理的)。
而 argv[0]就代表第一個參數,這里對應的就是"./test"。
argc和argv在mian裡面都是可以使用的,出了main的范圍就不能使用了。
再來說你提出的第一個地方,exec的問題。
exec實際上包含了一組函數,execl, execlp, execle, execv, execvp, execvpe
具體使用方法,你man execv就可以得到這些函數的使用方法。
exec函數的作用是,產生一個新進程,結束當前進程(具體執行的操作是復制當前進程的一部分數據和許可權,然後根據參數啟動一個新的進程)。
exec這組函數執行時候,需要提供的參數包括:一個可執行程序的路徑,傳遞給可執行程序的參數。(這里的參數,與剛才說到的main的參數含義相同。)
說到這里應該明白了吧...就一個。
我不知道你要hello world干什麼...照你意思給寫了個.
第一個,就是你貼出來的代碼改動一點點(我這邊運行有點問題):
#include <stdio.h>
main(int argc,char* argv[])
{
int i=0
while(i<=argc)
{
printf("arguement %d : %s ",i,argv[i]);
printf("\n");
i++;
}
}
運行程序:
$gcc test.c -o test
$./test hello world
輸出結果:
[ksl@myhost WGX]$ ./test hello world
Arguement 0:./test
Arguement 1:hello
Arguement 2:world
Arguement 3:(null)
然後第二個,使用exec的例子,我用execl吧..
文件名是test1.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void main(int argc,char *argv[])
{
printf("This is not exec...");
execl("./test","hello","world",NULL);
//如果exec執行正常,下面的printf將不會被執行
//因為當前進程已經結束,./test將被執行
printf("exec error");
}
輸出結果:
[ksl@myhost WGX]$ ./test1
Arguement 0:hello
Arguement 1:world
Arguement 2:(null)
後者並沒輸出"./test"....就是exec啟動的程序,其命令行參數中只有參數.(我也不曉得原因...=.=||)
『肆』 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庫的p2方法將標准輸入、標准輸出、標准錯誤輸出重定向到遠程,p2這個方法有兩個參數,分別為文件描述符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。
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://www.sohu.com/a/161766202_709042
https://www.freebuf.com/vuls/211847.html
https://www.freebuf.com/articles/system/178150.html
https://zhuanlan.hu.com/p/138393396
https://www.cnblogs.com/Dubing-ydfc/p/11749241.html
『伍』 LINUX+NGINX下的PHP shell_exec()函數執行linux命令 2019-08-08
LINUX+NGINX下的PHP shell_exec()函數執行linux命令
環境說明
手頭有一台linux的測試伺服器,最近因為業務需要,需要通過php訪問另一台伺服器去執行某些命令。
由於另一台伺服器已經對這台伺服器開了私鑰,所以在終端上是可以直接執行命令而不需要輸入密碼的。
問題
PHP無法使用exec命令,沒有任何返回值。
解決途徑
1.php.ini的配置有問題。
由於php是7.0以上的版本,取消了安全模式,所以考慮PHP.ini文件配置。
打開php配置文件,裡面有一行disabel_function的值,此處記錄了禁止運行的函數,在裡面講exec和shell_exec,system等函數刪除。
2.許可權問題
修改以後PHP可以運行部分命令了,但是部分外部程序和命令仍然不能運行。使用sudo返回失敗。
於是運行「whoami」查看,環境下php-frm的運行角色是www。
於是修改sudoers文件。
vi /etc/sudoers
將www添加到
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
下面:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
www ALL=(ALL) NOPASSWD:ALL
然後找到Default requiretty這一行,把他注釋掉
# Default requiretty
ps:意思就是sudo默認需要tty終端,注釋掉就可以在後台執行了.
重啟nginx和php-fpm
service nginx restart
service php-fpm restart
這樣,PHP就可以在需要執行外部命令的時候使用sudo利用root身份執行命令,而不會報錯或者執行失敗了!
『陸』 linux 系統中execl的作用是
intexecl(constchar*path,constchar*arg,...);
是系統提供的介面函數
execl是exec函數族中的一員
exec族函數的功能是載入一個新的程序替換掉當前的進程
它可以調用一個外部程序到當前的進程空間里
但不會產生一個新的進程(它只是將當前進程的映像替換成新載入的程序的映像)
可以寫一個程序清楚地看到
d.c
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char**argv)
{
printf("pid=%dppid=%d ",getpid(),getppid());
return0;
}
f.c
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char**argv)
{
printf("pid=%dppid=%d ",getpid(),getppid());
execl("./d","d",NULL);
return0;
}
在未執行execl調用之前和執行execl之後pid和ppid完全相同
由此可見execl並沒有創建新的進程
『柒』 linux下exec函數不返回結果
yes you are right , exec 是不返回的,它將當前進程的內容替換成要執行的程序的內容,這樣就可以運行一個新的程序了。如果exec 返回了說明執行新程序出錯了,內存不夠啊,系統異常啊。。