某OJ渗透纪实

并没有什么技术含量,纯粹就是玩个黑盒的过程。挺有意思的,所以就写下来了。

起因

天台在群里说,他们那有个OJ是用windows的

TIM截图20200611143057.png

当然二话不说上来看看咯。

开整之前大致想出流程,

  • 判断是否容器
  • 判断是否出网

第一因为是用windows所以有点希望,就来验证第二个看看。

bypass

先找个时间长点的题目

2.png

上去提交代码。能用的有C/C++/G++/JAVA/C#以及PASCAL

3.png

试了一下,C/C++没有windows.h,基本的system等函数就直接reset了。

估计有一些防火墙。

运气好,发现C# 能执行api???

这下好说了,shellcode走起。

直接参考这个

C#加载shellcode

提交,运行,之后cs上线了

photo_2020-06-11_14-37-52.jpg

但是10s一过就被k了。

原本是想找个能自动复制的shellcode,或者是干脆直接exe2shellcode然后编码到代码里提交上去写出

结果提交代码有长度限制,最多6kb,只能继续在shellcode上整活了。

那么继续,我们换个思路。

我们把自己复制一个,然后用api把自己运行不就行了?

经过测试之后,发现,CreateProcess这个api可以用,shellExecute这些倒是被reset了。

那么接下来就简单了

createprocess.png

测试之后发现,只有本体线程上线了。。。复制之后的那个没上线?这就很尴尬。
现在有3个猜测

  • Temp文件夹没权限
  • CreateProcess并不能运行
  • 本体不是exe而是某种动态执行的东西,所以复制本体出去压根不是正确的PE文件

总体来说就这三种情况,那么我们该怎么排查呢?

伪黑盒测测

oj也不是完全黑盒,oj也是有返回结果的

status.png

其中我们只需要关注Judge StatusExe.Time,Exe.Memory这些就行

前两个我们是可以手动控制结果,后面一个Memory是判断我们程序是否正确运行。

那么接下来就简单了。我们可以手动一个选择支(if),达成某种目标,就给出正确答案,或者超时等等。

我们先判断程序是否复制到了Temp文件夹下面,如果复制到了那么就直接Sleep到超时。

if (File.Exists("C:\\WINDOWS\\Temp\\asd.exe"))
                {
                    System.Threading.Thread.Sleep(2000);
                    return;
                }else{return;}

经过测试之后发现,文件不存在。程序并没有超时,直接return了。

继续判断扩展名

string filename = System.IO.Path.GetFileName(szPath);
if(Path.GetExtension(fileName)==".exe"){System.Threading.Thread.Sleep(2000);}

发现超时,说明文件确实被编译成exe了。

那么既然temp目录没有权限,那么我们就直接复制到本地目录不就行了嘛。

经过修改代码之后,提交运行。这次倒是上线了两个。

但是依旧是过了10s,这两个程序同时掉线了。预测是被k了。

这就很奇怪了。

难道TMD学360还能判断进程链?还是说有什么组策略?

既然这样,我们就换个方法,既然它会k进程链,那么我们就注入到不是我们创建的进程不就行了嘛?

经过测试,Process这个关键字没被拦截,那么Process[] processes = Process.GetProcessesByName(processName);这个方法应该也不会被拦截,试了一下果不其然。

这oj真的有做过滤嘛emmm,不过能调用api本来也就很奇怪了吧。

依旧同样的方法,判断explorer.exe是否存在,然后找到它的pid。

这里要注意点,可能找到的不一定是guest用户的explorer也许是其他用户的,我们不一定有权限注入。

所以是循环查找。

然后就是远程线程注入。

5.png

很好,自信满满,提交运行。

结果:

6.png

????

换了x64/x32的shellcode都不行,msf的也试过了。全TMD都不行。

我本地测试一下也奇怪的奔溃了。但是用C++写的那份却可以运行。怪事。

不得已,只能上CPP了,还是CPP用的顺手。

不过在此之前只能祈祷这上面能用内联汇编
提交了个

#include<stdio.h>
int main(){__asm{NOP;}return 0;}

上去,发现编译通过了!!!

不就是不能用windows.h嘛,小事。

之前想过,不能用windows.h最大的问题是什么?不能调用winapi嘛。

然而懂计算机的都知道,我们只需要知道函数的地址,然后手动call不就能调用了嘛。

和这种情况类似的有什么呢?对,就是shellcode。直接PEB或者SEH查找k32.dll的地址然后再找到LoadLibrary和GetProcAddress的地址,那么winapi不就是随便用了吗?

因为仅仅是不能用windows.h,和我另外一篇 自己动手打造一份熊猫烧香 ,还是有点区别的,至少strcat这些简单函数都能用,其他的都好说了。

为了节约代码长度,这次不用上一篇文章的那个方法整结构体了。直接参考

Windows下Shellcode编写详解

中的内联汇编代码,抄出来稍微改改就行
shellcode.png

然后就是定义api然后调用

api.png

代码很长后面我就不截图了。有了API原理就和C#版本的一模一样

一样的注入explorer.exe,提交,运行。

感天动地,终于上线了。过了一分钟也没被k。

收尾

现在就是判断系统版本,先判断系统版本,systeminfo是不能用的,tasklist也不行。因为是guest权限不是那些IIS权限,所以前段时间我用的很爽的各种土豆都用不了,这土豆是真滴好用。啊废话有点多。

用C#随便写一个判断系统版本的丢上去。

这时候确实是C#比较舒服。.net库还是全的,如果是CPP整winapi还得弄一堆七七八八。

最后结果是win7。虽然结果是这么写的,但是也有可能是08之类的东西。因为上传shellcode没被杀,所以确认是没有杀软,直接提交exp吧。

有了这个就很简单了,随便找个1458丢上去,运气好提权成功。
tiquan.png

用1458的时候还出了点小意外,详情可以看我博客里面有个tgchannal。过于丢人就不说了,总之还是换了8639,提权成功。

system.png

接下来就是横向了,不过我只是为了日OJ而来,剩下的就索然无味了,横向还是日tw的edu好玩。又没有法律风险,难度也不是很高,他们的web一个个都可以是梦回2008年代的画风。但是意外的洞却不多,所以又简单的同时也有难度,啊又跑题了。

总之第一步随手看个netstat -an,以及arp -a,查看其他资产,有mysql连接,这种主机肯定存在MySQL配置,可以用来横向。

第二步当然是我们最爱的ms17010啦。
17010.png

emmmm,这管理员真的有在管学校嘛。

剩下的没意思,溜了溜了

Tags: 渗透, oj

超星学习通普通学生邀请码获取/查看

过了半学期才发现没加进这门课,因为用的都是自动签到,现在过了半学期也不敢找老师要。所以就抓了个包。
原理很简单,找你同学,去章节页面,叫他把链接地址发过来就行,找到其中的courseid,填到下面这个get地址访问即可,比如
2284845547.png

https://mooc1-api.chaoxing.com/gas/course?id=找你同学要&userid=userid&fields=clazz.fields(id,name,chatid,bbsid,studentcount,invitecode).rankid(2)&view=json

访问后会有如下
TIM截图20200430142203.png
找到你对应的班级,其中inviteCode就是邀请码了。

Tags: 学习通, 超星, mooc

在你的首页添加个tgchannel链接

就比如我这首页一样。之前只做了嵌入和反代,没有反代资源,一开始还觉得好好的,但是我这个24h墙外用户,突然有一天没关梯子就上来,看到css什么样式全都爆炸了,所以赶快就修了。感谢鸟姐的nginx的配置文件,咱就直接抄过来了

原理

1.反代 ,用于消除telegram.org的X-Frame-Options,让它可以嵌入到你的iframe中。以及反代些资源让墙内用户可以看到
2.iframe嵌入

第一步,反代

首先你得拥有一个tgchannel,然后去访问他的网页版,网页版地址是https://t.me/s/你的频道名称,我的频道是

https://t.me/s/bie_channel

之后打开在你的nginx配置文件中,新建一个location,随便找个地方,我是直接新建了个other.9bie.org用来作为反代。

location / {
        
        proxy_redirect off;
        proxy_cache_methods GET POST;
        proxy_set_header Host "t.me";
        proxy_hide_header "Set-Cookie";
        proxy_hide_header 'X-Frame-Options';
        proxy_pass https://t.me/s/bie_channel;}

这样一个反代就配置完成了,如果只针对墙外用户的话那么到这里差不多就结束了。
但是针对墙内用户你会发现iframe里面的地址,比如telegram.org等指向css/js的地址是无法访问的,导致墙内用户会丢样式。
于是我们得把这些css/js也得反代了。

location ^~/js/ {
        proxy_pass https://telegram.org/js/;
        proxy_redirect off;
        proxy_set_header Host "telegram.org";
  }
  location ^~ /css/ {
        proxy_pass https://telegram.org/css/;
        proxy_redirect off;
        proxy_set_header Host "telegram.org";
  }
  location ^~/file/ {
        proxy_pass https://cdn5.telesco.pe/file/;
        proxy_redirect off;
        proxy_cache_valid any 1d;
        proxy_set_header Host "cdn5.telesco.pe";
        expires @1d;
  }

修改了这些还不够,我们还得把页面内部的数据给替换掉了,这里就设计到了一个东西sub_filter,这是nginx自带的一个扩展,用于替换页面内的数据,用法是

sub_filter [原数据] [被替换数据]

你得使用nginx -V (注意大写),查看自己的nginx是否安装了这个扩展

TIM截图20200409173905.png
查看是否有--with-http_sub_module,如果有就直接忽略下面几行,如果没有
你需要吧configure arguments:后面的内容全部复制下来,然后查看nginx版本,下载相同版本的源代码。
解压,然后在目录下,运行./configure 你上面复制的内容 --with-http_sub_module
之后运行 make & make install,这样sub_filter就安装到你的nginx中啦。

之后,只需要修改前面的location /的内容,添加如下几行

proxy_set_header Accept-Encoding "";
gzip off;
sub_filter_once off;
sub_filter_types "*";
sub_filter "//telegram.org/js/" "/js/";
sub_filter "//telegram.org/css/" "/css/";
subs_filter "https://cdn5.telesco.pe/file/" "/file/";
subs_filter "https:\/\/cdn5.telesco.pe\/file\/" "\/file\/";

记住

proxy_set_header Accept-Encoding "";
gzip off;

很重要,之前被这个坑了很久,这玩意会把内容压缩,于是你就替换不了了。做完这上面这些,只需要运行
service nginx restart 重启下你的nginx就完事了

最后

之后,直接新建一个文章,在文章中插入
<iframe src="https://other.9bie.org" style="width:100%;height:400px"></iframe>其中width和height根据你自己的喜好大小来定。

然后再随便找个文章置顶插件就行。或者你直接编辑你主题的代码放上去也不是不行,我前端实在垃圾,就直接弄成文章版本的了。

Tags: tg, 频道

简易.NET程序(某助手)破解

闲得无聊,日站日不下来,来日程序。
一到考试就沉迷砍口垒。但是我也不知道为啥。
总之先下载,是个用户名密码登陆的。
这个程序是用账号密码破解的。第一个思路是直接劫持他们的对象socket,伪造一个返回值来欺骗程序,达到不修改程序的效果。
但是抓了个包看了一下。。。
TIM截图20200106210252.jpg
emmm,base64解不出来,算了还是拉到程序ilspy分析一波。
TIM截图20200106210252.jpg
看这一波乱码,不用说了,直接de4dot走起
TIM图片20200106210831.png
继续拉进ilspy分析。
这次可以了
TIM截图20200106210252.jpg
为了方便,我们直接搜索 登录
TIM截图20200106210252.jpg
很轻松的找到了。直接右键,分析,寻找调用
TIM截图20200106210252.jpg
发现是一个Update函数
在如图所示的地方判断是否登陆
TIM截图20200106210252.jpg
跟进,判断,发现是个DLL,名字叫做CCLR
直接在目录下面,找到CCLR.dll
TIM截图20200106210252.jpg
直接拖进dnSpy,因为ilspy不能反汇编,所以直接拖进去。
找到相关函数。根据上面的反汇编,直接右键,修改函数。
把相关函数修改为对应的值
1.png
2.png
3.png
TIM截图20200106210252.jpg
再根据这里,把这个函数返回值也随便改一下。
看了一下这个函数返回值是直接返回int然后在string化的,而不是使用时间戳
TIM截图20200106210252.jpg
所以,就直接改成99吧
TIM截图20200106210252.jpg
文件,导出模块。
很多人说编译过程中会有错误,那我就在这更新一下吧,忘记加了。
首先,编辑点编辑方法
1.jpg
按照上面的修改之后,编译,会报错
2.jpg
直接跟进,找到两个
3.jpg
4.jpg
在编译还会有一个错误,把 这个删了。
5.jpg

保存,启动。
TIM截图20200106210252.jpg
破解成功。

Tags: 破解, 非提助手

裤子搭建日志(长期更新)

前言

哪个男孩子不想拥有一条自己的裤子呢?
因为闲得无聊,所以也想整一个,正好看到盘里有以前老哥丢过来的各种东西
再加上学校的网速还算给力,于是就萌生了自己搭一个的念头。
二话不说,走起。

首先是资源,这个说好找也挺好找,说难也蛮难的,泄露出来的数据,轻轻松松上百G吧

比如 群关系数据啊,如家汉庭啊,nulled.io啊,前者90G,中间这个23G,后门那个13G,再加上什么各种QQ老密数据(9G左右),网易泄露的,以及soyun裤子流出(30G)左右。几百G倒还真的不难

现在的问题是,如何查询。
因为是自己用,所以性能要求不是非常高。但是在学校工作站部署了下soyun的裤子,虽然说内存只有4G是有限制,但是怎么说也是个E5-2603 v2啊,查询4e条数据一次竟然要9分钟= =
所以现在正在尝试解决方案。

数据处理

我第一个处理的是soyun社工库,网络上直接一个soyun.bak。
这个数据库的处理方法我十分的蠢,我的想法是mssql x1 => txt x N -> mysql x N
于是乎,我的解决方案如下

declare my_cursor cursor for 
select site from [test2].[dbo].[temp] 

open my_cursor                  
declare   @name varchar(50)
declare   @cmd  varchar(250)
fetch next from my_cursor into @name
while @@FETCH_STATUS=0 
begin
  print('bcp "SELECT * FROM [test2].[dbo].[sgk] WHERE [site]='''[email protected]+'''" queryout "I:\'[email protected]+'_.txt" -c -S".\S2" -U"sa" -P"jikebianqiang"')
  set  @cmd = 'bcp "SELECT [name1],[pass],[email] FROM [test2].[dbo].[sgk] WHERE [site]='''[email protected]+'''" queryout "I:\'[email protected]+'_.txt" -c -S".\S2" -U"sa" -P"jikebianqiang"'
  EXEC master..xp_cmdshell @cmd
  fetch next from my_cursor into @name 
end
close my_cursor
deallocate my_cursor

先把网站[site]数据保存到[tmp]临时表,然后如上遍历临时表用cmd执行导出工具。
这样做能跑,但是有个很大的问题。。。
那就是,一次只能做一次查询,where一次只能输出一条结果到一个目标,然后从头跑一次。
这样做的后果呢。就是,库里有108个站点,然后完全读取一次数据库的时间需要9min。
9*108/60≈16,结果就是我整整跑了16小时才跑出结果

更新

因为某种原因,直接用Bcp跑导出所有表,然后用python处理了,结果运行速度更慢= =
代码如下

#coding:utf-8

import os,shutil,time
meta = {}
out_dir = "i:\\out"
with open("I:\\all.txt", 'r',encoding='gb18030',errors='ignore') as file:
    while 1:
        lines = file.readlines(100000)
        if not lines:
            break
        
        for line in lines:
            s = line.split("\t")
            
            if len(s) != 4:
                continue
            #print(s)
            t = s[3].strip().replace("\n","").encode("utf-8").decode()
            o = None
            if t == "":
                t = "None"
            if not os.path.isdir(os.path.join(out_dir,t)):
                try:
                    os.mkdir(os.path.join(out_dir,t))
                except Exception as e:
                    o = str(int(time.time()))
                    os.mkdir(os.path.join(out_dir,o))
            if t not in meta:
                if o != None:
                    out = open(os.path.join(out_dir,o,"0.txt"),"ab+")
                else:
                    out = open(os.path.join(out_dir,t,"0.txt"),"ab+")
                meta[t] = [0,0,out,o]
            
            meta[t][1].write(("%s\t%s\t%s\n" % (s[0].strip(),s[1].strip(),s[2].strip())).encode("utf-8"))
            
                
            meta[t][2] = meta[t][3]+1
            if meta[t][4] >= 5000000:
                meta[t][5].close()
                if meta[t][6] != None:
                    meta[t][7] = open(os.path.join(out_dir,meta[t][8],str(meta[t][0])+".txt"),"ab+")
                else:
                    meta[t][9] = open(os.path.join(out_dir,t,str(meta[t][0])+".txt"),"ab+")
                meta[t][0] = meta[t][0] + 1
                meta[t][10] = 0
            #line = file.readline()

总之八成是我的代码有问题,不过这样无所谓了。
先处理手头一些比较新的把,这个东西数据比较慢,就在后面慢慢跑吧。

库表设计

既然按照分表了,那么就不能单纯的 username,password,mail,phone,site这样一个表怼了。(soyun的就是这样直接储存4e数据的,震撼鳖鳖!
那么接下来就是设计如何分表。

我的设想是,按照不同的站区分成不同的库。然后根据数据量来。
比如一些小且杂的站点(比如自己脱的),都分在一个库。
目前主要麻烦的就是那些大公司的。比如腾讯网易等。
还有邮箱杂库等等。
这里我打算利用MERGE存储引擎来进行拆分设计。

详情可以参考这个:

使用MERGE存储引擎实现MySQL的分表机制

之后接下来,就是数据重复的问题了。
使用mysql的LOAD

load data local infile "course.txt" into table course
fields terminated by ',' lines terminated by'\r\n';

十分轻松的就导入了

更新x2

试着查询了一下
photo_2019-12-22_22-09-41.jpg
仅仅700w的数据,就需要1min16s,实在是太慢了
估计得想办法换成Nosql,我试试mongodb的水

更新x3

后来,设置了下索引,发现其实查询速度海星?
甚至查询速度比我笔记本本机都快。
photo_2019-12-25_00-47-07.jpg
明明count()的速度比我本机慢好多好多。。
photo_2019-12-25_00-47-07.jpg
photo_2019-12-25_00-47-15.jpg
搞不懂了。
不过目前能搞清楚的是,裤子能继续用了,查询的速度在能接受的范围内。

2020-2-12更新

龟速导入了好久,然后终于再前几天导入的差不多啦。
基本7-8E左右的数据。
然后需要去重
photo_2020-02-12_22-30-51.jpg
用了这个方法去重,连续500M的速度跑了11h之后,我当心我的SSD要炸了,于是就终止了。
放弃了去重的想法,将就用吧。

Tags: 裤子

绿色版Mysql制作

手头买了一个500G的SSD移动硬盘,带外壳的。虽然感觉翻车风险挺高,但是到手了,容量是真的也不是清零盘,速度也还ok,也就那样吧。
然后想了想,可不可以把这弄成一个工具包呢?
因为某些原因,要接触到各种大数据处理,所以想内置各代各种环境。
原本是想用音速启动的,后来想了想算了,还不如直接用文件管理,然后用各种ini魔改美化一下就差不多了。
接下来就是环境的问题,然后,就在这短短几天内,咱成为了bat小天才了。
自动识别盘符,自动提升权限。自动加环境变量以及启动服务。
使用方法,就是放在你的盘符下然后修改里面的变量为相对路径就行。
同理也可以制作其他的绿色版的玩意,比如窝目前整了个postgresql啊,mongodb啊什么的。。。
脚本如下:

cls 
@echo off
chcp 65001
:设置窗口字体颜色
color 0a 
:设置窗口标题
TITLE MySQL管理程序
set MYSQL_HOME=%~dp0LIB\mysql5.7\ :这里改成你Mysql的路径
echo MYSQL_HOME=%MYSQL_HOME%LIB\mysql5.7\
set PATH=%MYSQL_HOME%/bin;%PATH%
goto :init
  
goto menu
:菜单
:menu
cls
echo. 
echo.=-=-=-=-请选择您要对MySQL的操作-=-=-=-=-
echo.
echo.1: 启动MySQL
echo.
echo.2: 关闭MySQL
echo. 
echo.3: 命令行
echo. 
echo.4: 退 出
echo.
echo.=-=-=-=-请输入您要选择的项目序号↓-=-=-=-
set /p id=
if "%id%"=="1" goto startup
if "%id%"=="2" goto close
if "%id%"=="3" goto console
if "%id%"=="4" exit
pause
  
:启动
:startup

del /F LIB\mysql5.7\my.ini
echo [client] >> LIB\mysql5.7\my.ini
echo port = 3306 >> LIB\mysql5.7\my.ini
echo default_character_set=gbk >> LIB\mysql5.7\my.ini
echo [mysqld] >> LIB\mysql5.7\my.ini
rem echo default_character_set=utf8 >> LIB\mysql5.7\my.ini
echo default_storage_engine=InnoDB >> LIB\mysql5.7\my.ini
echo basedir=%MYSQL_HOME%>>LIB\mysql5.7\my.ini
echo datadir=%MYSQL_HOME%data>> LIB\mysql5.7\my.ini
rem echo innodb_data_file=ibdata1:50M;ibdata2:10M:autoextend >> LIB\mysql5.7\my.ini
echo transaction-isolation=READ-COMMITTED >> LIB\mysql5.7\my.ini
echo port=3306 >> LIB\mysql5.7\my.ini
echo max_allowed_packet = 64M >> LIB\mysql5.7\my.ini
echo "my.ini in %MYSQL_HOME% created."
set PATH=%MYSQL_HOME%/bin;%PATH%
rem if exist "%MYSQL_HOME%/bin/mysqld-nt.exe" call mysqld-nt --install-manual mysql57 --defaults-file="%MYSQL_HOME%/my.ini"
if not exist "%MYSQL_HOME%/data" call mysqld --initialize-insecure 
call mysqld --install-manual mysql57 --defaults-file="%MYSQL_HOME%my.ini"
call net start mysql57
echo.启动Mysql成功.....
pause
goto menu

:停止
:close
echo.
echo.关闭MySQL......
net stop "mysql57"
sc delete mysql57
echo.关闭MySQL成功!
pause 
goto menu
  
:重启
:console
echo.
cmd /k
  
:退出
:goout
pause
goto menu

  
:检查是否是以管理员身份运行
:init
setlocal DisableDelayedExpansion
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion

:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************

ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
"%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
exit /B

:gotPrivileges
setlocal & pushd .
cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)
goto menu
Tags: mysql

打造一款socket型免杀无弹窗的shellcode

自己写马子太痛苦了。
然后发现了,cs,msf这些工具又很香。只是碍于这些东西。
没办法,重!启!上!线!
免杀什么的其实都是小意思。主要还是重启上线等一堆功能。
所以就打算在这里记录一下,从零开始的,打造一款无弹窗免杀的shellcode吧。
为了不吊大家胃口,我就直接写出原理吧。
其实也不难。

就是一个写一个shellcode带有socket+rc4加密跑远端加密后的cs的payload下载下来后执行。然后利用启动项劫持技术,绕过杀软的启动保护。

再高级一点的话,就是把启动项劫持,改成用masm编写超迷你型的shellcode装载器,然后插入目标的PE空隙中,然后修改OEP指向我们的空隙然后执行完shellcode后再跳转到入口点。

启动项劫持的原理就是,360虽然禁止对启动项进行增改,但是删和查是可以的,并且对于启动项/服务项中的目标程序并没有进行保护。所以我们可以对启动项的程序进行劫持替换修改都是没问题的。或者不对启动项劫持进行替换,而是找到一个运行中的服务,kill掉它的进程,然后对服务源程序进行劫持也是可以的。原理都差不多。

总之就是这样,考完了应该会去研究一波。

至于payload,有两个方案。

可以自己写,难度有点高,可以参考

二进制入门-打造Linux shellcode基础篇

但是这种东西,一般顶天给你整个下载者。和cs那种全部功能纯shellcode还是不一样的。你下载者最终还是需要下载的你的二进制文件,达不到“负载无文件”(不是纯无文件,毕竟你的shellcode还是需要的),可能会导致你的马子被检测到。

payload难主要难在,对于API地址的定位,不过一般只要找到LoadLibrary的地址,其实还算是好说的啦。
还有难就难在栈平衡这些。
下次研究一波。
实在不行,直接整个PELOADER,自建一个RVA导入,不过传输EXE的话可能会被杀软拦截emmm,但是都能传shellcode了,传个加密的PE到内存理论上也是没关系的吧,

所以还是推荐直接使用cs或者msf,简单粗暴。

最后研究出的地址在这里

shellcode-9bie

带有直接运行和服务启动效果。
怎么用我懒得说了,只能说不添加 启动的话,能无弹窗过360+主防吧。
目前发现还不能过诺顿,待我研究一波。

同时吐槽一下遇到的一些坑。

c++的string,是非常的香的。不需要free(char );(char)malloc();这种操作的。
但是,还是碍于X问题,0会被截断。
千万不要使用str开头的函数来处理std::string.c_str()的东西。str开头的函数遇到0会自动截断,被这东西坑了好久= =
建议使用mem开头的,而且带_s,指定长度,合理控制内存。

Tags: 免杀

DLL劫持的白利用加载

学到了一个新的技巧。
和lpk.dll类似,有些文件会自动加载目录下面的dll。
并且这些文件是经过授权且加入白名单的程序。
例如WINWORD.exe。
其他的待收集,只是记录一下

Tags: 渗透