H2HC 2018 – 15º

Hello again, nesse post vou estar contando a minha experiência na H2HC de 2018.

Por alguns motivos macabros eu cheguei no evento por volta do meio dia no primeiro dia de evento, fiz o credenciamento etecetera e resolvi ir almoçar.

Depois do almoço fui direto pra palestra sobre a Urna Eletronica e segue as notas que eu fiz durante essa palestra:

Day 1

Auditoria na Urna Eletronica


Urna - 15:10 

Passos: 
- Fase de inspeção dos códigos fonte
- Submeteremos planos de teste
- Os planos de teste são analisados e aprovados pelo TSE 
- Executamos os planos de teste em uma bancada

Desde 2009 os processadores são da intel 

O Escopo de teste limitado, não se pode realizar testes em biometria e várias outras coisas são limitadas para testar.
A Chave utilizada para cifrar os binários estava em texto claro no código fonte.

As libs não eram hasheadas e foram ownadas pela equipe, uma das libs permitia adulterar o arquivo de log da urna.
No final das contas a urna tem falha pra caralho mas são bem complexadas e é díficil de ser hackeado no pouco tempo útil que um potencial agente malicioso teria.

Outros detalhes foram as falhas de segurança por exemplo no setup das urnas que é feito em ambientes comunitários onde crianças de escolas podem participar, é um possível vetor de ataque.

Depois dessa palestra tive a brilhante ideia de ir ver o que tava rolando no CTF, chegando lá claro, entrei num loop alienigena e só percebi quando era 18:30 e todas as palestras já tinham encerrado.

CTF

Como sempre(Nas duas edições que eu fui) o ambiente de CTF da h2hc é zoado ao meu ver, conflito de informação, a rede deles não tinha DHCP, rotas estranhas, enfim, bem zoado.
Não faço a minima ideia se esse CTF era o trendmicro que a final vai ser ou foi em tokyo ou se era da h2hc mesmo, sei que a equipe que organizou foi a RTFM, eu acho, pelo menos quer dizer, os caras tavam com a camisa da RTFM.

Depois de alguns minutos crimpando cabo e tentando configurar a interface de rede, consegui e comecei a brincar com uma challenge lá que tava no ip 172.17.1.150, depois de um pouco de levantamento:


Starting Nmap 7.60 ( https://nmap.org ) at 2018-10-20 16:54 -03
Nmap scan report for 172.17.1.150
Host is up (0.00021s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.4p1 Debian 10+deb9u4 (protocol 2.0)
| ssh-hostkey: 
|   2048 c3:54:17:73:2f:d1:6e:fa:d8:e9:10:d7:d3:82:1c:08 (RSA)
|   256 24:d6:b7:33:2f:9a:bf:ce:20:9b:d0:0a:e5:b5:4d:ab (ECDSA)
|_  256 b8:76:6f:c5:69:92:c9:c3:92:8e:be:17:6e:f6:d2:f8 (EdDSA)
81/tcp   open  http    Apache httpd 2.4.25 ((Debian))
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Apache2 Debian Default Page: It works
6565/tcp open  unknown
| fingerprint-strings: 
|   GenericLines: 
|     x20 | | _) 
|     x20 _| _ x20|/ | _` | _| _||x20x20/ 
|     ___|_| _, |.__/__|___/_| _|__,_|__|_| _| __x20
|     ___/_| 
|     Receiving transmission... 
|     Direto ao ponto: para obter a flag decifre: 662718742916742916568981651626732931168318730383873916402131876516311874298016311887658716742916038916318165037403511602738336391667898116317336871631188716022681871662742626164516311887162931896556168703432980165689811655733687168162167403165689816516028743167303431602872674873587165518733187358765165689811655730331163189160287267487358739166789811631733687163118871665874316627426261645165689811629317356167403165289034387652673034316730343160916291889551656898116188955164387876216311887166573020274314518892687165189872939393966391609311629878747291656898116187335871662893187033174732639162718742
|   NULL: 
|     x20 | | _) 
|     x20 _| _ x20|/ | _` | _| _||x20x20/ 
|     ___|_| _, |.__/__|___/_| _|__,_|__|_| _| __x20
|     ___/_| 
|     Receiving transmission... 
|_    Direto ao ponto: para obter a flag decifre: 497205073945073945941382924561503933450605507806385445876933389245330507398345330538923845073945781345338292780778314574500659544571138245335059384533053845746182384542076161455345330538453933139294453878573983459413824546505938458242450778459413829245743857455078574574386107381838454605503338183892459413824546507833453313457438610738183854457113824533505938453305384592385745420761614553459413824539335094450778452313785738926150785745507857458545390513464594138245051346455738384245330538459250747407335305136138453113383954545449544585334539383829394594138245055018384542133338783307506154457205073
6969/tcp open  http    Apache httpd 2.4.25 ((Debian))
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Apache2 Debian Default Page: It works
8080/tcp open  http    H2 database http console
|_http-title: H2 Console
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port6565-TCP:V=7.60%I=7%D=10/20%Time=5BCB87F6%P=x86_64-pc-linux-gnu%r(N
SF:ULL,5BB,"ntx20x20__|x20x20x20x20x20x20x20x20x20x20x20x
SF:20x20|x20x20x20x20x20x20x20x20x20\x20x20|x20x20x20x2
SF:0x20x20x20|x20x20x20x20x20_)x20x20x20x20x20x20ntx20
SF:(x20x20x20x20x20_||x20x20|x20_x20\x20x20_|x20x20_x20
SF:\x20|\/x20|x20x20_`x20|x20x20_|x20x20_||\x20\x20/
SF:x20nt\___|_|x20\_,x20|.__/\__|\___/_|x20x20_|\__,_|
SF:__|_|x20_|x20_\_\x20ntx20x20x20x20x20x20x20x20___/_
SF:|x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x
SF:20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20
SF:x20x20x20x20ntnnx20Receivingx20transmission...x20nx20Dir
SF:etox20aox20ponto:x20parax20obterx20ax20flagx20decifre:x20497205
SF:07394507394594138292456150393345060550780638544587693338924533050739834
SF:53305389238450739457813453382927807783145745006595445711382453350593845
SF:33053845746182384542076161455345330538453933139294453878573983459413824
SF:54650593845824245077845941382924574385745507857457438610738183845460550
SF:33381838924594138245465078334533134574386107381838544571138245335059384
SF:53305384592385745420761614553459413824539335094450778452313785738926150
SF:78574550785745854539051346459413824505134645573838424533053845925074740
SF:73353051361384531133839545454495445853345393838293945941382450550183845
SF:42133338783307506154457205073")%r(GenericLines,5BB,"ntx20x20__|x2
SF:0x20x20x20x20x20x20x20x20x20x20x20x20|x20x20x20x20x20
SF:x20x20x20x20\x20x20|x20x20x20x20x20x20x20|x20x20x20
SF:x20x20_)x20x20x20x20x20x20ntx20(x20x20x20x20x20_||x
SF:20x20|x20_x20\x20x20_|x20x20_x20\x20|\/x20|x20x20_`
SF:x20|x20x20_|x20x20_||\x20\x20/x20nt\___|_|x20\_,x2
SF:0|.__/\__|\___/_|x20x20_|\__,_|\__|_|x20_|x20_\_\x2
SF:0ntx20x20x20x20x20x20x20x20___/_|x20x20x20x20x20x20x2
SF:0x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x
SF:20x20x20x20x20x20x20x20x20x20x20x20x20x20x20ntnnx20R
SF:eceivingx20transmission...x20nx20Diretox20aox20ponto:x20para
SF:x20obterx20ax20flagx20decifre:x206627187429167429165689816516267329
SF:31168318730383873916402131876516311874298016311887658716742916038916318
SF:16503740351160273833639166789811631733687163118871602268187166274262616
SF:45163118871629318965561687034329801656898116557336871681621674031656898
SF:16516028743167303431602872674873587165518733187358765165689811655730331
SF:16318916028726748735873916678981163173368716311887166587431662742626164
SF:51656898116293173561674031652890343876526730343167303431609162918895516
SF:56898116188955164387876216311887166573020274314518892687165189872939393
SF:96639160931162987874729165689811618733587166289318703317473263916271874
SF:2");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 79.56 seconds

Eu vi isso aqui:


Apache/2.4.25 (Debian) Server at 172.17.1.150 Port 6969

Então fui dar uma avaliada no banner:



	  __|             |           |       |     _)      
	 (     _||  | _   _|  _  |/ |  _` |  _|  _||  / 
	___|_| _, |.__/__|___/_|  _|__,_|__|_| _| __ 
	        ___/_|                                       
	

 Receiving transmission... 
 Direto ao ponto: para obter a flag decifre: 05883606347606347607614786762559344976263659532671727673684971867649360634427649367186717606347653617649478653065317760459262972767461477649592971764936717604254771766706252576417649367176344961860776715321344276076147761659297176476776065376076147867604712176595321760471250671237176163659497123718676076147761659534976496176047125067123717276746147764959297176493671768671217667062525764176076147763449590776065376096153217186255953217659532176447634366116760761477636611676217171677649367176865904040649413661257176176171347272720572764449763471713534760761477636592371766761497153490659257276883606347668255917764753256126293476493671762636592525715317717659497667618649763043438176616876493606347636613449727276557186717607614776176151769186076749329384498630569018840407134323431390558414677490361591293033128276 de acordo com a matriz a seguir:
--------------------
6 Z z / b " i y 9 W 
; # G L P @ w g B } 
Q d ? v U l c  r D T  
_ C K M ~ 0 0 0 0 0 
--------------------



[!] OBS: Se o challenge cair, tente novamente dentro de 1 min!

Ficou na cara que era uma challenge de PPC, então comecei a codar com uns outros anonimos lá que não vou citar o nome, no final das contas a gente ficou com um pau no código e já era 18 e pouca e resolvi deixar pra lá, segue o código para registros historicos:


#!/usr/bin/python3
import socket
import sys
import re

def getResult(mapping, matriz):
    itens = [x.split(" ") for x in matriz]
    itens.append(e"")
    itens.insert(0,"")
    acc = ""
    print(itens)
    for a in range(len(mapping)):
        try:
          if(a % 2 != 1):
            acc += itens[int(str(mapping[a]))][int(str(mapping[a+1]))]
            a += 2
        except:
          pass
    return acc

def recebe(s):
  return re.findall(r'[0-9]+', s)

def getMatrix(s):
    arr = s.split('--------------------')[1].strip().split("n") # Possivel falha aqui, sem acesso ao server para realizar testes
    return arr

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('172.17.1.150',6565))
dataSocket = s.recv(2048).decode() # Recebe valores do socket 
hashMap = recebe(dataSocket)[0]    # Passa para regex para extrair o texto cifrado
matrix = getMatrix(dataSocket)     # Tenta receber a Matriz atráves de split/strip [ ERROR ]

resultSet = getResult(hashMap, matrix)
print(resultSet)


exit()

Tinha uma outra challenge de eng reversa mas eu só peguei o arquivo, ta na minha lista aqui de afazeres.

Então fui pro hotel.

Day2

Exploring the Safari: Just in time Exploitation

Demonstração de exploração e buffer overflow no safari, essa palestra tava em inglês, os tradutores nunca ajudam muito e o cara falava muito rápido, então vai ter vários pontos de interrogação por ai nas notas.


Segunda CVE 2018-??? 


Leaking Information.

A maioria dos navegadores possui falhas semelhantes pois o trabalho deles seguem as mesmas especificações


Na real eu cheguei atrasado pra essa palestra. KKJ peguei o finalzinho.

Constraint Solvers For Reverse Engineering

Esse tema é bastante interessante, eu conheci no ano passado na palestra da Barbie alguma coisa e é simplesmente do caralho.


Constraint é basicamente a relação entre variaveis. 
Constraint Solvers
Constraint Programmming
Express relations between variables in the form 


Microsoft Z3 -> SMT Solver da MS 

- Extremely powerful contrainet solver(prover)
- Bindings to python -> easy to use
- Open - Source
-> Bom para identificar se determinada função é segura. 

Outras opções 

Language
How talk to Z3 and smt solvers in general.

- Do u like lisp 
SMT Lib -> smtlib.cs.uiowa.edu -> versão 1 e 2

LISP BitVec 8 -> 


SMT Solver for CTF 

Função que receba um input de usuário e é necessário filtrar certos caracteres 
Com a teoria de strings e regex você pode usar o Z3 para realizar os testes. 



Fuzzing com SMT 

Projeto SAID(?) Projeto da microsoft que utilizou essa funcionalidade para achar falhas no MS e no office.
klee/klee -> Testa todos os caminhos possíveis da função, Inferno p/ compilar 


MantiCore -> ctf

Junto com o manticore existem vários exemplos. 

crackme and stuff


github.com/edgarmb

SPLITTER TOr STUFF

Essa palestra aqui foi a que fez o evento inteiro valer a pena, muito interessante e eu até fiz outro post sobre isso explicando etc.
Segue as notas:


Splitter -> Ferrametna para dificultar o tráfego do tor, sobe instâncias do tor.
hproxy -> interface web que pode ser utilizada para monitorar o status da instancia do browser.

Setar o browser pro tor.

Não precisa usar o browser do tor. 

o splitter vai gerar credenciais aleatorias para a utilização. 


Basicamente um loadbalance entre várias instâncias do tor. 

Cada instância ta amarrada em um país diferente, logo a diferença de entry node, exit node do tor. Então diminui as changes de utilizar um relay adulterado. 

Técnicas de De-Anonymization, ataques à rede tor. 
Pontos fracos dessa técnica: (Que o splitter vai tentar explorar e quebrar a correlação) (?) 
- 
Quando vocẽ acha que ta usando o torbrowser você não está completamente seguro, o que é obvio. 


Com essa técnica, você consegue consumir vídeos em vários instãncias do tor, podendo ter uma resposta mais rápida. O problema do tor é que é lento, com esse loadbalance 
Estatisticas para nerd.


Remover países



Motivation: 
- Privacy is just a dream. 
- Tor Network is slow and unstable!
- many de-anonymization techniques impacting the trhust of users on tor networking

Quem controla a chave privada controla o tráfego. 
APP: "Konversations"

No momento que o circuito do tor pegar um relay que está num país lento, todo o circuito é afetado. 
 
Máquinas adulteradas podem fazer técnicas de de-anonymatizon

O tor só é utilizado na hora de fazer merda. 

Correlação é a relação do entry-node com o exit-node.

O Básico sobre o tor.
Uma vez que o circuito é fechado, ela fica fechado mesmo que você não esteja conectado, time-based shit. A conexão já fica estabelecida para que próximos usuários que forem utilizar, o circuito já está estabelecido.


A sua conexão vai permanecer no tor durante 10 minutos, é o tempo que o circuito no tor que a conexão vai ficar estabelecida. Muitas técnicas de de-anony, exibem tempo para que você seja identificado pelo tcp stream atráves de uma injeção de _________  

TCP STREAM -> Conexão já estabelecida, 3way handshake. 

COrrelação do entry-node com o exit-node, correlação envolve caracteristica de tráfego e correlaçao do tempo, vão procurar pela pattern injetada e analsiar o tempo para identificar que é você.

A importância do entry-node e porquẽ ele é o alvo das técnicas de de-anoyn, porquẽ é o primeiro que você se conecta, então se o entry-node for adulterado, você já foi sabotado, é importante não se conectar diretamente, utilizar VPN. 

É bem comum eles pegarem o exit-node, então vão saber pra onde você está indo. 

O Middle-node, basicamente quebra a correlação natural(De qual site site você está acessando), o middle-node não conhece você, então o middle-node quebra a correlação. 

São muitas técnicas, foram selecionadas 3 porém só será falado sobre duas. 

Paper: 
- Low-Resource Routing Attacks Anonyomus Systems. 

Identificar em qual posição o relay adulterado tá. (?)  

Paper: 
A Practival Congestion Attack on Tor Using long paths
Habilitar JS 
filetype:pdf inurl:evans  -> https://www.useninx.org/legacy/event/sec09/tech/full_papers/evans.pdf

Para trabalhar com tor precisa-se blindar 100% 

Paper: 
"How Much Anonymity does network latency leak" Pela latencia é possível identificar a rota, e fazer a correlação. 

tisssec-latency-leak.pdf

Favorita: 
Paper:
On The effectiveness of traffic analysus Agaisnt Anonymity Network Using Flow Records. 
Usandi protocolo da cisco a nível de core da internet. Mapearam os relays da tor e pegaram os nodes que estavam próximo de roteadores. Roteadores proximos do entry-node, então você tem um cenario 

Adulteram o server e colocam os arquivos, arquivos podem ser qualquer coisa que o browser vai fazer download. Então eles injetam uma pattern para que se identifique o disturbiu causado na hora que volta pra rede tor e na hora que sai da rede tor, utiliznado os protocolos da cisco. 

Esssa técnica é absurda, porquẽ a galera conseguiu IRL, não em lab, identificaram 81.4% das pessoas com precisão. 

As técnicas tem em comum o seguinte, que será utilizado o mesmo circuito do tor para transferir a pattern, o mesmo path global será feito. 

Cada técnica tem uma pattern. 

The exploit challenge: 

Então pra cada tcp stream tem que fazer passar por um circuito diferente(entry-node,middle-node,exit-node). Cada requisição tem que ser feita por um circuito diferente. 

A geração de circuito é aleatória, então você pode cair num adulterado, por isso você precisa controlar isso. 

É necessário controlar o tempo de conexão do tcp stream, não se pode deixar a conexão por tempo suficiente


github.com/renegr1nch/splitter

O Splitter vai forçar o tor a trocar o circuito a toda hora, por padrão é 10 minutos, com o splitter você consegue usar 10 segundos. 10 segundos é o tempo minimo limite. 

O caminho do tcp stream que vai correr -> 

hproxy -> privoxy -> tor  
layer7 -> layer5 -> layer5 

Como controlar o país que o tor está utilizando: 
Arquivo de configuração, entry-nodes: 
Países para entry-node. 
exit-nodes -> todos os páises exceto determinado país. forçar um caminho geográfico diferente.

COmo exlude-nodes, coloca todos os outros páises 



Ciclo de vida do splitter
Baseado no ciclo de instãncias ativas: Baseado em lista de paises, configura o tor, inicia a instancia, forca um novo circuito, mata a instancia. 


O arquivo de configuração do hproxy, por padrão utiliza roundrobin, gera uma pattern, o que é ruim pois poderia ser identificado o próximo.


aliguard vps, na vps vai estar o splitter, que vai conectar numa vpn publica. 

Uma vez que o exit-node repete, pode significar que o seu dado está passando por um node que pode estar adulterado.

Por padrão o splitter evita de utilizar nodes com pouca banda. 


Considerações Finais: 
Utilizar o tor sem combinação de VPN+VPS = suicidio, só analisar os papers. 

Verificar quantos exit-nodes um determinado país tem antes de incluir tal país na lista.

O Spliiter vai dificultar as coisas para técnicas de de-anonymized techiniches

Antes de considerar um país na lista é necessário identificar quantos exit-nodes existem no país


Uma vez que sua conexão na tor fica estável, você se torna um entry-node da rede.



Dump com tcp stream sendo morto
Download de uma ISO, começa via splitter, quando ele cortar o tcp-stream, utilizar um wget pra se preparar para um corte, então o  wget por exemplo poderia suportar o kill do tcp-stream


wget -c -> Dá sequencia no download. 

Cracking the captcha

Essa palestra foi de um palestrante que ano passado falou sobre Parasite OS, eu achei que a palestra ia ser foda mas fiquei meio frustrado, mas sem problemas.
Ele basicamente criou um algoritmo para quebrar captchas e contou lá todas as dificuldades que ele teve, eu não fiquei até o final pois tinha que voltar pra minha aldeia.


Computer Vision, OCR octical caracter recognization

Captcha -> Complete automatec public turning test to tell computes and humans apart. 


Sessão -> Sessão de usuário e server
Soluução -> 

Ferramenta do google que faz OCR, 

guerrilhamail. api ajax que cria os usuários automaticos.

TESSEREACT

opencv -> Manipulação de imagem

Thats all

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.