过了半学期才发现没加进这门课,因为用的都是自动签到,现在过了半学期也不敢找老师要。所以就抓了个包。
原理很简单,找你同学,去章节页面,叫他把链接地址发过来就行,找到其中的courseid,填到下面这个get地址访问即可,比如
访问后会有如下
找到你对应的班级,其中inviteCode就是邀请码了。
过了半学期才发现没加进这门课,因为用的都是自动签到,现在过了半学期也不敢找老师要。所以就抓了个包。
原理很简单,找你同学,去章节页面,叫他把链接地址发过来就行,找到其中的courseid,填到下面这个get地址访问即可,比如
访问后会有如下
找到你对应的班级,其中inviteCode就是邀请码了。
就比如我这首页一样。之前只做了嵌入和反代,没有反代资源,一开始还觉得好好的,但是我这个24h墙外用户,突然有一天没关梯子就上来,看到css什么样式全都爆炸了,所以赶快就修了。感谢鸟姐的nginx的配置文件,咱就直接抄过来了
1.反代 ,用于消除telegram.org的X-Frame-Options,让它可以嵌入到你的iframe中。以及反代些资源让墙内用户可以看到
2.iframe嵌入
首先你得拥有一个tgchannel,然后去访问他的网页版,网页版地址是https://t.me/s/你的频道名称,我的频道是
之后打开在你的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是否安装了这个扩展

查看是否有--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根据你自己的喜好大小来定。
然后再随便找个文章置顶插件就行。或者你直接编辑你主题的代码放上去也不是不行,我前端实在垃圾,就直接弄成文章版本的了。
2020-04-02 | 随便写的什么奇怪的东西,技术文章 |
闲得无聊,日站日不下来,来日程序。
一到考试就沉迷砍口垒。但是我也不知道为啥。
总之先下载,是个用户名密码登陆的。
这个程序是用账号密码破解的。第一个思路是直接劫持他们的对象socket,伪造一个返回值来欺骗程序,达到不修改程序的效果。
但是抓了个包看了一下。。。
emmm,base64解不出来,算了还是拉到程序ilspy分析一波。
看这一波乱码,不用说了,直接de4dot走起
继续拉进ilspy分析。
这次可以了
为了方便,我们直接搜索 登录
很轻松的找到了。直接右键,分析,寻找调用
发现是一个Update函数
在如图所示的地方判断是否登陆
跟进,判断,发现是个DLL,名字叫做CCLR
直接在目录下面,找到CCLR.dll
直接拖进dnSpy,因为ilspy不能反汇编,所以直接拖进去。
找到相关函数。根据上面的反汇编,直接右键,修改函数。
把相关函数修改为对应的值



再根据这里,把这个函数返回值也随便改一下。
看了一下这个函数返回值是直接返回int然后在string化的,而不是使用时间戳
所以,就直接改成99吧
文件,导出模块。
很多人说编译过程中会有错误,那我就在这更新一下吧,忘记加了。
首先,编辑点编辑方法
按照上面的修改之后,编译,会报错
直接跟进,找到两个

在编译还会有一个错误,把 这个删了。
保存,启动。
破解成功。
2020-02-12 | 随便写的什么奇怪的东西,技术文章 |
摆烂了,直接上ELK了,简单粗暴快捷
哪个男孩子不想拥有一条自己的裤子呢?
因为闲得无聊,所以也想整一个,正好看到盘里有以前老哥丢过来的各种东西
再加上学校的网速还算给力,于是就萌生了自己搭一个的念头。
二话不说,走起。
首先是资源,这个说好找也挺好找,说难也蛮难的,泄露出来的数据,轻轻松松上百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]='''+@name+'''" queryout "I:\'+@name+'_.txt" -c -S".\S2" -U"sa" -P"jikebianqiang"')
set @cmd = 'bcp "SELECT [name1],[pass],[email] FROM [test2].[dbo].[sgk] WHERE [site]='''+@name+'''" queryout "I:\'+@name+'_.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存储引擎来进行拆分设计。
详情可以参考这个:
之后接下来,就是数据重复的问题了。
使用mysql的LOAD
load data local infile "course.txt" into table course
fields terminated by ',' lines terminated by'\r\n';十分轻松的就导入了
试着查询了一下
仅仅700w的数据,就需要1min16s,实在是太慢了
估计得想办法换成Nosql,我试试mongodb的水
后来,设置了下索引,发现其实查询速度海星?
甚至查询速度比我笔记本本机都快。
明明count()的速度比我本机慢好多好多。。

搞不懂了。
不过目前能搞清楚的是,裤子能继续用了,查询的速度在能接受的范围内。
龟速导入了好久,然后终于再前几天导入的差不多啦。
基本7-8E左右的数据。
然后需要去重
用了这个方法去重,连续500M的速度跑了11h之后,我当心我的SSD要炸了,于是就终止了。
放弃了去重的想法,将就用吧。
手头买了一个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 menu2020-01-02 | 随便写的什么奇怪的东西,技术文章 |
自己写马子太痛苦了。
然后发现了,cs,msf这些工具又很香。只是碍于这些东西。
没办法,重!启!上!线!
免杀什么的其实都是小意思。主要还是重启上线等一堆功能。
所以就打算在这里记录一下,从零开始的,打造一款无弹窗免杀的shellcode吧。
为了不吊大家胃口,我就直接写出原理吧。
其实也不难。
就是一个写一个shellcode带有socket+rc4加密跑远端加密后的cs的payload下载下来后执行。然后利用启动项劫持技术,绕过杀软的启动保护。
再高级一点的话,就是把启动项劫持,改成用masm编写超迷你型的shellcode装载器,然后插入目标的PE空隙中,然后修改OEP指向我们的空隙然后执行完shellcode后再跳转到入口点。
启动项劫持的原理就是,360虽然禁止对启动项进行增改,但是删和查是可以的,并且对于启动项/服务项中的目标程序并没有进行保护。所以我们可以对启动项的程序进行劫持替换修改都是没问题的。或者不对启动项劫持进行替换,而是找到一个运行中的服务,kill掉它的进程,然后对服务源程序进行劫持也是可以的。原理都差不多。
总之就是这样,考完了应该会去研究一波。
至于payload,有两个方案。
可以自己写,难度有点高,可以参考
但是这种东西,一般顶天给你整个下载者。和cs那种全部功能纯shellcode还是不一样的。你下载者最终还是需要下载的你的二进制文件,达不到“负载无文件”(不是纯无文件,毕竟你的shellcode还是需要的),可能会导致你的马子被检测到。
payload难主要难在,对于API地址的定位,不过一般只要找到LoadLibrary的地址,其实还算是好说的啦。
还有难就难在栈平衡这些。
下次研究一波。
实在不行,直接整个PELOADER,自建一个RVA导入,不过传输EXE的话可能会被杀软拦截emmm,但是都能传shellcode了,传个加密的PE到内存理论上也是没关系的吧,
所以还是推荐直接使用cs或者msf,简单粗暴。
最后研究出的地址在这里
带有直接运行和服务启动效果。
怎么用我懒得说了,只能说不添加 启动的话,能无弹窗过360+主防吧。
目前发现还不能过诺顿,待我研究一波。
同时吐槽一下遇到的一些坑。
c++的string,是非常的香的。不需要free(char );(char)malloc();这种操作的。
但是,还是碍于X问题,0会被截断。
千万不要使用str开头的函数来处理std::string.c_str()的东西。str开头的函数遇到0会自动截断,被这东西坑了好久= =
建议使用mem开头的,而且带_s,指定长度,合理控制内存。