介绍
在网上偶然看见的比赛,这里简单分享一下,
本比赛是由德克萨斯大学奥斯汀分校的信息与系统安全协会团队举办
Misc
Trapped in Plain Sight 1
ssh连接,密码为password
查看当前目录,有个flag.txt文件,赋予权限发现需要系统命令
先看看suid,发现一个xxd命令,没见过
谷歌查看后发现xxd是一个十六进制转储工具,常用于:
-
查看二进制文件的十六进制内容。 -
将二进制文件转换为可读的十六进制格式(或反向转换)。 -
调试和分析文件结构。
这里直接查看该就拿到了flag,utflag{SpeciaL_Permissionz}
不过既然可以利用,就提权一下吧,ctfobins查看一下
LFILE=file_to_read
sudo xxd "$LFILE" | xxd -r
因为sudo命令无法使用,提权不成功
Trapped in Plain Sight 2
先看一下描述
常规信息收集,没有什么利用信息
在根目录下发现启动文件
了解一下
-
setfacl:设置文件访问控制列表(ACL)。 -
-m:修改文件的 ACL 规则。 -
u:$SECRET_USER:r: -
u:表示用户(user)。 -
$SECRET_USER:环境变量,代表目标用户名(如 alice
)。 -
r:授予读(read)权限。 -
/home/USER1 是环境变量(如
/home/bob/flag.txt`)。
#为指定用户添加对文件的读权限
setfacl -m u:$SECRET_USER:r /home/$USER1/flag.txt #
unset SECRET_USER #清除变量值
unset USER1 #清除变量值
在/home文件下发现一个新用户
这里猜测可能需要利用新用户来读取,hunter2可能是密码
登录该用户,找到flag, utflag{4ccess_unc0ntroll3d}
Crytpo
RSA
下载附件,是低指数加密攻击
直接利用脚本求解
import gmpy2
from Crypto.Util.number import *
defrsa_small_e_attack(ciphertext, e, n):
# 计算e次方根
m, exact = gmpy2.iroot(ciphertext, e)
# 检查结果是否为精确的整数解
if exact:
return int(m)
else:
returnNone
# 数据
n=21507386633439519550169998646896627263990342978145866337442653437291500212804540039826669967421406761783804525632864075787433199834243745244830254423626433057121784913173342863755047712719972310827106310978325541157116399004997956022957497614561358547338887866829687642469922480325337783646738698964794799137629074290136943475809453339879850896418933264952741717996251598299033247598332283374311388548417533241578128405412876297518744631221434811566527970724653020096586968674253730535704100196440896139791213814925799933321426996992353761056678153980682453131865332141631387947508055668987573690117314953760510812159
e=3
c=6723702102195566573155033480869753489283107574855029844328060266358539778148984297827300182772738267875181687326892460074882512254133616280539109646843128644207390959955541800567609034853
# 执行攻击
plaintext = rsa_small_e_attack(c, e, n)
if plaintext isnotNone:
print(long_to_bytes(plaintext))
else:
print("攻击失败,无法直接从密文中恢复明文。")
# utflag{hmm_maybe_bad_idea}
DCΔ 直流δ-单
思路:单素数RSA
题目给了n,c,e三个数
n = 399956368360808862373914258335185223080849636197711424060797090309268643429064461492550414549161330948819635837600839124910339139212025975705016633767495247163243281423582407941339197895052969960664399531226116807938480610953640675838340969642399505783577667601230289640157854573282615113017817753471366212008719316238931155299741896658264134636523008018510523774126757209492757800553768281613227711738371473830681563493341816035127889532515105148615575695347672918819305383651095344758737833444302556494599778991752161562622963652164008980839152347260377969421014616624263631920322958235478733540894255954351848359580013695597870908080170511403061620632540407634608773118202473287854599776791229532885611074739079107324575619148211269673210431496846247978541032947073060592123529635361112170678347924377962162254827262375685704046691718585952854410058401794022674628779309507437739620598639589987596443373586284136126401843497367142210715014480599609277532331148988390798073713743339823218981940779096432112651466716648010370850152213399051968069102663753404120592506704133217642671853086570223710424683386625314802805217882906873879240914022607713870946351691046929143491841506422542038315876506588525639983398522454145866029283449
e = 65537
c = 22644125297186385803212285721101686380290089858624593588464228942417644877688212364383835956263619653769244324906844180248816686517049952319431524113838480708352331162026595736354019259708442449783760846242702532176456117138374450898213788623580234048867117546091028843127595147910526821835855070663317466469650577618010308109119812464711010326075908158768138773973732088207030977470605554056485614676156104134673446546446752627654287202815354367643042773923258958887865030737447323798382020847653880886311162447594373201951226217556835030816588457674298560260109378271244834215832992407457137601161490484862135147963942227371690835380497920998286827898323068399708168699403459009009580152834747843780155917438758224782364193716322974594031272100820264364860227674838730962348140555980411714722361909800417953974064469599278274083750031569853934963716467881656073359393449142980936480726005445774158733389270553554093627622406166942859792490275434896108377393648278975530519769034633686070931694499857110956537102727286491854314244036392929790997824274724196292688659782806587688964714529943288954314300861531138101192901942534064757877725334672680909389193357725470116673323012331269218651347104807494994267835408427908717684178629
根据题目提示,可能就一个素数
在该网站分解https://www.alpertron.com.ar/ECM.HTM,点击factor即可
或者调用yafu分解n
.yafu.exe "factor(x)"#x是待分解的数
成功分解,可以看到p,q值相同
p=19998909179272975096669389773315684909164840476930738123591959958398932097041125093572976768403454709172312115056676217567714135065584289066946488822717110035175886060013869752746528110783649242456127578482532542251448083935376109090114352728675578298146585186423055045769485483629739528100502325926126065585392531444778435555737739407677466146189470978162623830003195010534137805929579970953953819006507688647292456336763899513727791292581312482817948726557865657118159131434894505604528936556072666055920148673374873823318296419969165536109100159362271450418965389139196396590576777869148638544055146306458627451893
由于pq值相同,故为单素数RSA,利用python代码求解即可
import libnum
import gmpy2
from Crypto.Util.number import *
import math
n = 399956368360808862373914258335185223080849636197711424060797090309268643429064461492550414549161330948819635837600839124910339139212025975705016633767495247163243281423582407941339197895052969960664399531226116807938480610953640675838340969642399505783577667601230289640157854573282615113017817753471366212008719316238931155299741896658264134636523008018510523774126757209492757800553768281613227711738371473830681563493341816035127889532515105148615575695347672918819305383651095344758737833444302556494599778991752161562622963652164008980839152347260377969421014616624263631920322958235478733540894255954351848359580013695597870908080170511403061620632540407634608773118202473287854599776791229532885611074739079107324575619148211269673210431496846247978541032947073060592123529635361112170678347924377962162254827262375685704046691718585952854410058401794022674628779309507437739620598639589987596443373586284136126401843497367142210715014480599609277532331148988390798073713743339823218981940779096432112651466716648010370850152213399051968069102663753404120592506704133217642671853086570223710424683386625314802805217882906873879240914022607713870946351691046929143491841506422542038315876506588525639983398522454145866029283449
p= 19998909179272975096669389773315684909164840476930738123591959958398932097041125093572976768403454709172312115056676217567714135065584289066946488822717110035175886060013869752746528110783649242456127578482532542251448083935376109090114352728675578298146585186423055045769485483629739528100502325926126065585392531444778435555737739407677466146189470978162623830003195010534137805929579970953953819006507688647292456336763899513727791292581312482817948726557865657118159131434894505604528936556072666055920148673374873823318296419969165536109100159362271450418965389139196396590576777869148638544055146306458627451893
e=65537
c = 22644125297186385803212285721101686380290089858624593588464228942417644877688212364383835956263619653769244324906844180248816686517049952319431524113838480708352331162026595736354019259708442449783760846242702532176456117138374450898213788623580234048867117546091028843127595147910526821835855070663317466469650577618010308109119812464711010326075908158768138773973732088207030977470605554056485614676156104134673446546446752627654287202815354367643042773923258958887865030737447323798382020847653880886311162447594373201951226217556835030816588457674298560260109378271244834215832992407457137601161490484862135147963942227371690835380497920998286827898323068399708168699403459009009580152834747843780155917438758224782364193716322974594031272100820264364860227674838730962348140555980411714722361909800417953974064469599278274083750031569853934963716467881656073359393449142980936480726005445774158733389270553554093627622406166942859792490275434896108377393648278975530519769034633686070931694499857110956537102727286491854314244036392929790997824274724196292688659782806587688964714529943288954314300861531138101192901942534064757877725334672680909389193357725470116673323012331269218651347104807494994267835408427908717684178629
phi_n=p*(p-1)# 注意此处
d=libnum.invmod(e,phi_n)
m=pow(c,d,n)
print(long_to_bytes(m))
# utflag{th3_t0t13nt_funct10n_uns1mpl1f13d}
Autokey Cipher
题目给了提示是 自动密钥密码,该密码和维吉尼亚密码很相似,https://en.wikipedia.org/wiki/Autokey_cipher
写一个脚本爆破,猜测明文头是utflag
defdecrypt_autokey(ciphertext, initial_key):
ciphertext = ciphertext.upper().replace(' ', '')
key = [ord(c.upper()) - ord('A') for c in initial_key]
plaintext = []
key_length = len(key)
key_idx = 0# 跟踪密钥使用进度
for c in ciphertext:
ifnot c.isalpha():
plaintext.append(c)
continue
if key_idx < key_length:
k = key[key_idx]
else:
k = ord(plaintext[key_idx - key_length]) - ord('A')
# 解密
decrypted = (ord(c) - ord('A') - k) % 26
plaintext.append(chr(decrypted + ord('A')))
key_idx += 1
return''.join(plaintext)
# 已知条件
ciphertext = "lpqwma{rws_ywpqaauad_rrqfcfkq_wuey_ifwo_xlkvxawjh_pkbgrzf}"
known_plain = "UTFLAG"
# 自动提取初始密钥
initial_key = []
for i in range(len(known_plain)):
c = ord(ciphertext[i].upper()) - ord('A')
p = ord(known_plain[i]) - ord('A')
initial_key.append(chr((c - p) % 26 + ord('A')))
initial_key = ''.join(initial_key)
# 解密全文
plaintext = decrypt_autokey(ciphertext, initial_key)
print(f"初始密钥: {initial_key}")
print(f"解密结果: {plaintext}")
# 验证密钥扩展机制
print("n验证过程:")
print(f"初始密钥 ({len(initial_key)}位): {initial_key}")
print("后续密钥生成:")
for i in range(len(initial_key), len(initial_key)+5):
print(f"密钥位置 {i}: {plaintext[i - len(initial_key)]}")
#utflag{keyless_autokey_cipher_with_knowns_plaintext_is_trivial}
提交之后发现不对,把里面的英文单词分割出来,可以看到利用字符头为utflag去爆破出来的结果是不对的
看来只能利用其他的方法了,在该网站https://www.guballa.de/vigenere-solver,先爆破一下
这里爆破出一个可能的密钥
解码得到,看起来很像utflag
utileg{why_foemuency_dnelysis_than_know_eekinnind_latters}
#转换一下
utflag{why_foemuency_dnelysis_than_know_eekinnind_latters}
#why foemuency dnelysis than know eekinnind latters
这里的坑是需要把错误的英语单词修复
utflag{why_frequency_analysis_when_know_beginning_letters}
Forensics-取证
Streamified
下载查看是625位二进制,25*25,很像是QR码,这里有一个想法是转为ASCII字符,但是需要先转为字节,而一个字节需要8位二进制,显然不行
看题目描述有扫描字眼,可能需要转换位二维码
丢给deepseek跑一个脚本
from PIL import Image
#625位,25*25
binary_str = "1111111000011110101111111100000100110101100100000110111010110110111010111011011101010101001101011101101110101001010010101110110000010100101111010000011111111010101010101111111000000001011110100000000010111110001110110011111000111010101100000010100000100011110111100101110111100000100001010100010000011000001000000001011011111100010001010111011100011010100010101001111100110111011100001001100110000011100001100110101011111111100000000110000001000110101111111001111001101010011100000101101001010001000010111010111100011111111011011101011001110011010011101110101010011110010010110000010011011001011100011111111010101010000010111"
# 原始尺寸 25*25
qr_size = 25
# 放大倍数
scale = 10
# 边框宽度
border = 20
# 转换二进制字符串为二维矩阵
matrix = [[binary_str[y*qr_size + x] == '1'for x in range(qr_size)] for y in range(qr_size)]
# 计算新尺寸(包含边框)
new_size = qr_size * scale + border*2
img = Image.new('RGB', (new_size, new_size), 'white') # 白色背景
pixels = img.load()
# 绘制二维码(注意坐标系)
for y in range(qr_size):
for x in range(qr_size):
color = (0, 0, 0) if matrix[y][x] else (255, 255, 255) # 1为黑色,0为白色
# 放大像素
for dy in range(scale):
for dx in range(scale):
px = x * scale + dx + border
py = y * scale + dy + border
pixels[px, py] = color
img.save("flag_qr.png")
#utflag{b!t_by_b!t}
拿到二维码扫描一下即可
原文始发于微信公众号(泷羽Sec-track):【CTF】UTCTF2025 wp
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论