Bienvenido a la CLI Virustotal, una herramienta diseñada para aquellos que aman las interfaces virustotales y de línea de comandos. Con esta herramienta puede hacer todo lo que normalmente haría utilizando la página web de Virustotal, que incluye:
Y mucho más ...
Como esta herramienta utiliza la API virustotal debajo del capó, necesitará una clave API virustotal. Al registrarse con Virustotal, recibirá una clave API gratuita, sin embargo, las claves de API gratuitas tienen una cantidad limitada de solicitudes por minuto, y no tienen acceso a algunas características premium como búsquedas y descargas de archivos. Si está interesado en usar esas características premium, contáctenos.
Hay dos formas de instalar la herramienta: mediante el uso de uno de nuestros binarios precompilados o construyéndola usted mismo.
Los binarios precompilados se pueden encontrar en la página de lanzamientos. Hay binarios para Windows, Linux y Mac OS X. Para usarlos, simplemente descargue el archivo, descomprima y colóquelo en un directorio donde cree que es más conveniente de usar.
Para compilar el programa, necesitará GO 1.14.x o superior instalado en su sistema y escriba los siguientes comandos:
$ git clone https://github.com/VirusTotal/vt-cli
$ cd vt-cli
$ make install
Nota: Para usar el binario vt
, asegúrese de que el GOBIN
sea parte de su variable envía PATH
:
$ export GOBIN= ` go env GOPATH ` /bin
$ export PATH= $PATH : $GOBIN
Para los usuarios de Mac OS, hay una fórmula de cerveza disponible. Tenga en cuenta que esto no es mantenido por Virustotal.
$ brew install virustotal-cli
Para los usuarios de Windows, hay un manifiesto de Winget disponible. Tenga en cuenta que esto no es mantenido por Virustotal.
winget install VirusTotal.vt - cli
Chocolatey también es compatible (tampoco lo mantienen Virustotal):
choco install vt - cli
Si planea usar vt-cli
en Windows de manera regular, le recomendamos que evite la consola de Windows estándar y use CyGWin. La consola de Windows es muy lenta cuando imprime grandes cantidades de texto (como lo hace vt-cli
), mientras que Cygwin funciona mucho mejor. Además, puede beneficiarse del soporte de Cygwin para Command Auto-Completion, una característica práctica que la consola de Windows no ofrece. Para aprovechar el cumplimiento automático, asegúrese de incluir el paquete bash-completion
al instalar Cygwin.
Una vez que haya instalado la herramienta VT-CLI, es posible que desee configurarla con su tecla API. Esto no es estrictamente necesario, ya que puede proporcionar su clave API cada vez que invoca la herramienta utilizando la opción --apikey
( -k
en forma corta), pero eso es una molestia si va a usar la herramienta con frecuencia (¡y apostamos a que lo harás!). Para configurar su clave API, simplemente escriba:
$ vt init
Este comando solicitará su clave API y la guardará en un archivo de configuración en su directorio de inicio (~/.vt.toml). También puede especificar su tecla API utilizando la variable de entorno VTCLI_APIKEY
. Si especifica su clave API de múltiples maneras, la opción --apikey
tendrá la precedencia más alta, seguida de la variable de entorno VTCLI_APIKEY
, la clave API en el archivo de configuración se utilizará como el último recurso.
Si está detrás de un proxy HTTP, puede decirle vt-cli
, que es la dirección de su servidor proxy de múltiples maneras. Uno está usando la opción --proxy
, como en:
$ vt --proxy http://myproxy.com:1234 < command >
También puede usar la variable de entorno VTCLI_PROXY
o agregar la siguiente línea al archivo de configuración:
proxy= " http://myproxy.com:1234 "
Si va a utilizar esta herramienta con frecuencia, es posible que desee tener comandos automáticos. Ahorra tiempo precioso y pulsaciones de teclas. Sin embargo, tenga en cuenta que debe configurar su API como se describe en la sección anterior antes de seguir los pasos enumerados a continuación. La API es necesaria para determinar los comandos a los que tendrá acceso.
Linux:
$ vt completion bash > /etc/bash_completion.d/vt
Mac OS X:
$ brew install bash-completion
$ vt completion bash > $( brew --prefix ) /etc/bash_completion.d/vt
Agregue las siguientes líneas a ~/.bash_profile
:
if [ -f $( brew --prefix ) /etc/bash_completion ] ; then
. $( brew --prefix ) /etc/bash_completion
fi
Cygwin:
Asegúrese de que el paquete bash-completion
esté instalado (Cygwin no lo instala de forma predeterminada) y escriba:
$ vt completion bash > /usr/share/bash-completion/completions/vt
❗ Es posible que deba reiniciar su shell para que el autocompleto comience a funcionar.
El script de salida de vt completion zsh
debe colocarse en algún lugar bajo el directorio $fpath
. Por ejemplo, directorio .oh-my-zsh/completions
:
$ mkdir /Users/ $USERNAME /.oh-my-zsh/completions
$ vt completion zsh > /Users/ $USERNAME /.oh-my-zsh/completions/_vt
Reinicie la carcasa.
Obtenga información sobre un archivo:
$ vt file 8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85
Obtenga información sobre un archivo en formato JSON:
$ vt file 8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85 --format json
Obtenga un informe de análisis específico para un archivo:
$ # File analysis IDs can be given as `f-<file_SHA256_hash>-<UNIX timestamp>`...
$ vt analysis f-8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85-1546309359
$ # ...or as a Base64 encoded string, retrieved from the `vt scan file` command:
$ vt scan file test.txt
test.txt MDJiY2FiZmZmZmQxNmZlMGZjMjUwZjA4Y2FkOTVlMGM6MTU0NjQ1NDUyMA==
$ vt analysis MDJiY2FiZmZmZmQxNmZlMGZjMjUwZjA4Y2FkOTVlMGM6MTU0NjQ1NDUyMA==
- _id: " MDJiY2FiZmZmZmQxNmZlMGZjMjUwZjA4Y2FkOTVlMGM6MTU0NjQ1NDUyMA== "
_type: " analysis "
date: 1546454520 # 2019-01-02 13:42:00 -0500 EST
stats:
failure: 0
harmless: 0
malicious: 0
suspicious: 0
timeout: 0
type-unsupported: 0
undetected: 0
status: " queued "
Descargue archivos dados una lista de hash en un archivo de texto, un hash por línea:
$ cat /path/list_of_hashes.txt | vt download -
Obtenga información sobre una URL:
$ vt url http://www.virustotal.com
Obtenga la dirección IP que sirvió una URL:
$ vt url last_serving_ip_address http://www.virustotal.com
Buscar archivos:
$ vt search " positives:5+ type:pdf "
Escanear un archivo:
$ vt scan file < yourfile >
< yourfile > ZDZiOTcxY2JhNDE0MWU5ZWRjN2JjNGQ2NTdhN2VjODU6MTU3MDE3Mjg1NQ==
$ vt analysis ZDZiOTcxY2JhNDE0MWU5ZWRjN2JjNGQ2NTdhN2VjODU6MTU3MDE3Mjg1NQ==
- _id: " ZDZiOTcxY2JhNDE0MWU5ZWRjN2JjNGQ2NTdhN2VjODU6MTU3MDE3Mjg1NQ== "
_type: " analysis "
date: 1570172855 # 2019-10-04 09:07:35 +0200 CEST
stats:
failure: 0
harmless: 0
malicious: 0
suspicious: 0
timeout: 0
type-unsupported: 0
undetected: 0
status: " queued "
Detecciones de exportación y etiquetas de archivos de una búsqueda en formato CSV:
$ vt search " positives:5+ type:pdf " -i sha256,last_analysis_stats.malicious,tags --format csv
Detecciones de exportación y etiquetas de archivos de una búsqueda en formato JSON:
$ vt search " positives:5+ type:pdf " -i sha256,last_analysis_stats.malicious,tags --format json
Cuando solicita información sobre un archivo, URL, dominio, dirección IP o cualquier otro objeto en Virustotal, obtiene muchos datos (de forma predeterminada en formato YAML) que generalmente es más de lo que necesita. Puede reducir la información que se muestra en la herramienta VT -CLI utilizando las opciones --include
y --exclude
de línea de comandos ( -i
y -x
en forma corta).
Estas opciones aceptan patrones que coinciden con los campos que componen los datos y le permiten incluir solo un subconjunto de ellos, o excluir cualquier campo que no sea interesante para usted. Veamos cómo funciona usando los datos que tenemos sobre http://www.virustotal.com
como ejemplo:
$ vt url http://www.virustotal.com
- _id: 1db0ad7dbcec0676710ea0eaacd35d5e471d3e11944d53bcbd31f0cbd11bce31
_type: " url "
first_submission_date: 1275391445 # 2010-06-01 13:24:05 +0200 CEST
last_analysis_date: 1532442650 # 2018-07-24 16:30:50 +0200 CEST
last_analysis_results:
ADMINUSLabs:
category: " harmless "
engine_name: " ADMINUSLabs "
result: " clean "
AegisLab WebGuard:
category: " harmless "
engine_name: " AegisLab WebGuard "
result: " clean "
AlienVault:
category: " harmless "
engine_name: " AlienVault "
result: " clean "
last_http_response_code: 200
last_http_response_content_length: 7216
last_http_response_content_sha256: " 7ed66734d9fb8c5a922fffd039c1cd5d85f8c2bb39d14803983528437852ba94 "
last_http_response_headers:
age: " 26 "
cache-control: " public, max-age=60 "
content-length: " 7216 "
content-type: " text/html "
date: " Tue, 24 Jul 2018 14:30:24 GMT "
etag: " " bGPKJQ " "
expires: " Tue, 24 Jul 2018 14:31:24 GMT "
server: " Google Frontend "
x-cloud-trace-context: " 131ac6cb5e2cdb7970d54ee42fd5ce4a "
x-frame-options: " DENY "
last_submission_date: 1532442650 # 2018-07-24 16:30:50 +0200 CEST
private: false
reputation: 1484
times_submitted: 213227
total_votes:
harmless: 660
malicious: 197
Observe que los datos devueltos generalmente siguen una estructura jerárquica, con algunos campos de nivel superior que pueden contener subcampos que a su vez pueden contener sus propios subcampos. En el ejemplo anterior last_http_response_headers
tiene age
de los subcampos, cache-control
, content-length
, etc., mientras que total_votes
tiene harmless
y malicious
. Para referirnos a un campo particular dentro de la jerarquía, podemos usar una ruta, similar a la forma en que identificamos un archivo en nuestras computadoras, pero en este caso, vamos a usar un carácter de punto (.) Como separador para componentes de ruta, en su lugar. de las cortes (o barras de retroceso) utilizados por la mayoría de los sistemas de archivos. Los siguientes son rutas válidas para nuestra estructura de ejemplo:
last_http_response_headers.age
total_votes.harmless
last_analysis_results.ADMINUSLabs.category
last_analysis_results.ADMINUSLabs.engine_name
Los filtros aceptados por ambos --include
y --exclude
son rutas en las que podemos usar *
y **
como marcadores de posición para uno y muchos elementos de ruta, respectivamente. Por ejemplo, foo.*
Coincide con foo.bar
pero no foo.bar.baz
, mientras que foo.**
coincide con foo.bar
, foo.bar.baz
y foo.bar.baz.qux
. Por otro lado, foo.*.qux
coincide foo.bar.qux
y foo.baz.qux
pero no foo.bar.baz.qux
, mientras que foo.**.qux
coincide foo.bar.baz.qux
y cualquier otro camino comenzando con foo
y terminando con qux
.
Para seleccionar cereza solo los campos que desea, debe usar --include
seguido de un patrón de ruta como se explicó anteriormente. También puede incluir más de un patrón utilizando el argumento --include
varias veces o usándolo con una lista de patrones separados por comas. Las siguientes dos opciones son equivalentes:
$ vt url http://www.virustotal.com --include=reputation --include=total_votes. *
$ vt url http://www.virustotal.com --include=reputation,total_votes. *
Aquí tiene diferentes ejemplos con sus salidas (suponiendo que vt url http://www.virustotal.com
devuelve la estructura que se muestra arriba)::
$ vt url http://www.virustotal.com --include=last_http_response_headers.server
- last_http_response_headers:
server: " Google Frontend "
$ vt url http://www.virustotal.com --include=last_http_response_headers. *
- last_http_response_headers:
age: " 26 "
cache-control: " public, max-age=60 "
content-length: " 7216 "
content-type: " text/html "
date: " Tue, 24 Jul 2018 14:30:24 GMT "
etag: " " bGPKJQ " "
expires: " Tue, 24 Jul 2018 14:31:24 GMT "
server: " Google Frontend "
x-cloud-trace-context: " 131ac6cb5e2cdb7970d54ee42fd5ce4a "
x-frame-options: " DENY "
$ vt url http://www.virustotal.com --include=last_analysis_results. **
- last_analysis_results:
ADMINUSLabs:
category: " harmless "
engine_name: " ADMINUSLabs "
result: " clean "
AegisLab WebGuard:
category: " harmless "
engine_name: " AegisLab WebGuard "
result: " clean "
AlienVault:
category: " harmless "
engine_name: " AlienVault "
result: " clean "
$ vt url http://www.virustotal.com --include=last_analysis_results. * .result
- last_analysis_results:
ADMINUSLabs:
result: " clean "
AegisLab WebGuard:
result: " clean "
AlienVault:
result: " clean "
$ vt url http://www.virustotal.com --include= ** .result
- last_analysis_results:
ADMINUSLabs:
result: " clean "
AegisLab WebGuard:
result: " clean "
AlienVault:
result: " clean "
Observe también que _id
y _type
también son nombres de campo y, por lo tanto, puede usarlos en sus filtros:
$ vt url http://www.virustotal.com --include=_id,_type, ** .result
- _id: " 1db0ad7dbcec0676710ea0eaacd35d5e471d3e11944d53bcbd31f0cbd11bce31 "
_type: " file "
last_analysis_results:
ADMINUSLabs:
result: " clean "
AegisLab WebGuard:
result: " clean "
AlienVault:
result: " clean "
La opción --exclude
de manera similar a --include
pero en lugar de incluir los campos coincidentes en la salida, incluye todo excepto los campos coincidentes. Puede usar esta opción cuando desee mantener la mayoría de los campos, pero dejar de lado algunos de ellos que no son interesantes. Si usa --include
y --exclude
simultáneamente --include
entra en acción primero, incluidos solo los campos que coinciden con los patrones --include
, mientras que --exclude
entra después de eso, eliminando cualquier campo restante que coincida con --exclude
patrones.