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

过了半学期才发现没加进这门课,因为用的都是自动签到,现在过了半学期也不敢找老师要。所以就抓了个包。
原理很简单,找你同学,去章节页面,叫他把链接地址发过来就行,找到其中的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: 破解, 非提助手

裤子搭建日志(此贴完结)

2022

摆烂了,直接上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存储引擎来进行拆分设计。

详情可以参考这个:

使用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: 免杀