Google+: ¿cierra? definitivamente sus puertas

Google ha anunciado que echa el cierre Google+, y lo hace después de haber descubierto un fallo de seguridad en la API de la red social que ha expuesto los datos de hasta 500.000 usuarios.

La compañía de Mountain View identificó el problema durante la primavera pasada como parte de una auditoría enmarcada en Project Strobe, una revisión completa del acceso de terceros a los datos de las cuentas de Google y de los dispositivos Android.

No obstante, a pesar de que el problema había afectado a cientos de miles de usuarios, la Gran G decidió no hacer público el hallazgo en el momento en el que fue descubierto, un movimiento que, de acuerdo con The Wall Street Journal, se llevó a cabo para evitar un escrutinio regulatorio que causaría daños a la reputación de la compañía.

En la publicación de su blog, Google ha comunicado que uno de los hallazgos de Project Strobe fue un fallo de seguridad en una de las API de Google+, cuya función es permitir a los usuarios otorgar acceso a las aplicaciones de Google+ a los datos de su perfil y a la información pública del perfil de sus amigos. A causa del error, las aplicaciones también podían acceder a campos del perfil que no estaban marcados como públicos. 

Image result for google+

Continue reading

Analizando #tweets para conocer a la gente

El usuario de Twitter @x0rz compartio hace poco una interesante herramienta para analizar los perfiles de distintos usuarios de Twitter, a traves de sus propios tweets. Los datos que toma como base para este analisis son:

  • Actividad de tweets, por hora y por dia de la semana
  • Zona horaria e idioma utilizado.
  • Fuente de su actividad (celular, navegador web, … )
  • Geolocaciones.
  • Sus hashtags, los usuarios a los que mas da retweets y sobre todo, a aquellos que menciona.
  • Analisis de amigos, basado en las zonas horarias mas frecuentes y sus idiomas.

Instalacion

Como primer paso, clonar el repositorio de Github desde este link. Luego, actualizar el archivo keys.py con el par de keys del usuario. Si no tenes API keys, podes gestionarlo desde https://apps.twitter.com.

Cabe destacar que se necesita utilizar Python2.7, por lo que las dependencias pueden instalarlas con pip:

pip install -r requirements.txt

Uso

Incluso mas facil:

usage: tweets_analyzer.py -n <screen_name> [options]
Simple Twitter Profile Analyzer

argumentos opcionales:
  -h, --help            show this help message and exit
  -l N, --limit N       limit the number of tweets to retreive (default=1000)
  -n screen_name, --name screen_name
                        target screen_name
  -f FILTER, --filter FILTER
                        filter by source (ex. -f android will get android
                        tweets only)
  --no-timezone         removes the timezone auto-adjustment (default is UTC)
  --utc-offset UTC_OFFSET
                        manually apply a timezone offset (in seconds)
  --friends             will perform quick friends analysis based on lang and
                        timezone (rate limit = 15 requests)
  -e path/to/file, --export path/to/file
                        exports results to file
  -j, --json            outputs json
  -s, --save            saves tweets to tweets/{twitter_handle}/{yyyy-mm-
                        dd_HH-MM-SS}.json
  --no-color            disables colored output
  --no-retweets         does not evaluate retweets

Un ejemplo de output es el siguiente:

68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f3830302f312a4b75686644725f32624f4a3743504f7a56586e774c412e706e67

Para mas proyectos, pueden visitar su repositorio en:

https://github.com/x0rz/tweets_analyzer

Una introducción a REST Web Services.

Los Web Services (WS) son una implementación de las tecnologías web, utilizadas para la comunicación entre máquinas. En éste caso, nos vamos a centrar en uno de ellos, los servicios RESTful (muchas de las veces lo llaman solo REST). Son una variante de WS mucho más ligeras y en la práctica éstos realizan peticiones HTTP similares a las llamadas HTTP regulares.

Propiedades importantes de los WS REST

  • Uso de métodos HTTP (GET, POST, PUT y DELETE)
  • No existe un estandar que especifique los parámetros que envía. Éstos pueden enviarse desde:
    • La URL, como parte de ella.
    • En las cabeceras
  • Los parámetros y las respuestas se estructuran en formato JSON o XML.
  • Posee un manejo de autenciación y sesión customizado, donde usualmente se utilizan tokens de seguridad: esto es necesario ya que no maneja cookies de sesión.
  • No existe información formal sobre éste mismo, aunque se han propuesto algunos documentos que nunca fueron adaptados oficialmente: Proposed standard for describing RESTful web services called WADL.

El reto de testear la seguridad de los WS REST

  • Inspeccionar la aplicación, no revela la superficie de ataque, por ejemplo, las URLs y la estructura de los parámetros usados por REST. Las razones son:
    • Ninguna aplicación utiliza todas las funcionalidades y parámetros que expone el servicio.
    • Muchas de ellas, son activadas de forma dinámica del lado del cliente y no como links de las páginas.
    • El cliente de la aplicación algunas veces no es una aplicación web y no permite inspección de elementos o del mismo código fuente.
  • Los parámetros no son estándares, haciéndo díficil determinar si son parte de la URl o una cabecera e incluso si vale la pena fuzzearlo.
  • La cantidad de párametros que suelen utilizarse, por ejemplo en estructuras JSON, incluyen decenas de parámetros. Fuzzear cada uno y aplicar una lógica requiere de mucho tiempo.
  • Los mecanismos de autenticación requieren de conocimiento en reversing, haciendo dificil el uso de herramientas automatizadas (ya que no pueden trackear la secuencia de login)

Entonces, ¿cómo realizar un pentest a un WS REST?

Primero, es importante determinar la superficie de ataque a través de la documentación de implementación – para éstos casos es recomendable un pentest del tipo white-box, para así conocer información específica del servicio. Éste tipo de análisis asegurará una mayor cobertura de la superficie de ataque. A continuación, se detallan algunos puntos a tener en cuenta:

  • Descripción formal del servicio – Mientras otros tipos de WS como SOAP poseen una descripción formal, para el caso de REST a menudo existen. Dicho esto, WSDL 2.0 o WADL pueden describir al WS REST.
  • Una guía de desarrollo para el uso del servicio es menos detallada pero suele ser encontrada, incluso cuando se realiza un análisis del tipo black-box.
  • Análisis del código fuente de la aplicación o la configuración – en muchos frameworks, por ejemplo .NET, la definición del WS puede ser fácilmente obtenida desde los archivos de configuración.

NOTA: Recolectar peticiones completas utilizando un proxy es siempre un punto importante en los pentests, pero en éstos casos en particular influye mucho ya que los WS REST hacen mucho más que consultas solo por GET. Todo lo que se haya recolectado, determina distintos puntos de la superficie de ataque:

  • Prestar atención a parámetros no-estándares:
    • Por ejemplo, cabeceras HTTP anormales – muchas veces se basan en parámetros interesantes y fuzzeables.
    • Determinar si los segmentos de la URL tiene un patrón repetitivo. Éstos patrones pueden incorporar una fecha, un número o un ID como string que indica que la URL tiene parámetros embebidos. Por ejemplo: http://server/srv/2017-10-21/use.php
    • Buscar por parámetros estructurados – los cuales pueden ser JSON, XML o alguna estructura no-estándar.
    • Si el último elemento de la URL no tiene extensión, es posible que sea un parámetros. Esto “cobra sentido” cuando la tecnología de la aplicación utiliza en otras pantallas extensiones o si el método anterior la utilizó. Por ejemplo: http://server/svc/Grid.aspx/GetRelatedItems
    • Buscar por segmentos de la URL que varíen con frecuencia – un segmento en particular de la URL que “posee” muchos valores puede ser un parámetro y no un directorio físico. Por ejemplo, si la URL http://server/src/XXXX/page utiliza varios valores diferentes para XXXX, hay muchas probabilidades en que XXXX sea un parámetro.

Analizar las peticiones recolectadas para optimizar el fuzzing – luego de identificar potenciales parámetros a fuzzear, los valores devueltos deben ser analizados para determinar:

  • Valores válidos vs inválidos, para disminuir los falsos positivos y pérdidas de tiempo.
  • Extender la superficie de conocimiento del usuario para también agrandar la superficie de ataque.
  • Recordar que siempre que se esté fuzzeando, emular de forma correcta el mecanismo de autenticación que se utiliza.

Fuente: OWASP

El protocolo SOCKS y su diferencia con HTTP

SOCKS es un protocolo que facilita la ruta de los paquetes que se envían entre un cliente y un servidor a través de un servidor proxy. Originalmente, Socks5 fue un sistema de protocolo que ofrecía mucha seguridad, puesto que creaba firewalls y otros métodos de seguridad fáciles de administrar.

La versión 5 de Socks, que es una exensión de Socks 4, y provee un poderoso sistema de autentificación e incluye UDP, mientras que Socks 4 sólo ofrece un sistema de firewall inseguro basado en aplicaciones cliente-servidor TCP, incluidos TELNET, FTP y protocolos como HTTP, WAIS y GOPHER.

Pero ¿cuál es exactamente la diferencia entre proxies SOCKS y HTTP?

SOCKS: Bill quiere comunicarse con Jane a través de Internet, pero un firewall de su propia conexión no está autorizado a comunicarse a través de él. Por tanto, se conecta a una proxy SOCKS de su red y envía información sobre la conexión que desea hacer con Jane. El proxy SOCKS abre una conexión a través del firewall y facilita la comunicación entre Bill y Jane.

HTTP: Bill quiere descargarse una página Web que hospeda Jane en un Servidor Web. Bill no puede conectarse directamente al servidor de Jane, porque un firewall en la red se lo impide. Para poder comunicarse con el servidor, Bill se conecta a su red proxy HTTP. Su navegador de Internet se comunica con el servidor proxy y envía una cabecera HTTP solicitando la conexión. El servidor proxy HTTP lee la petición y busca el host de la cabecera. Luego se conecta al servidor especificado en al cabecera y transmite datos a Bill.

Fuente: Internet Lab

Repositorio de #cheatsheets

Las cheat sheets son pequeñas notas o apuntes que nos ayudan a recordar los puntos importantes sobre cierto tema. En informática son muy comunes encontrar de éstas por la cantidad de plataformas/sistemas/tecnologías que existen y las enormes funcionalidades que tienen.

cheat.sh es un sitio web que unifica varios repositorios de cheat sheets. Éste provee de una interfaz web limpia desde la que podemos acceder a más o menos 783 (actualmente), agrupadas en 8 secciones. Las secciones cubren comandos de Linux y varios lenguajes de programación.

Además, cheat.sh se asegura de una salida limpia, la cual nos permite consultar dichas cheat sheets desde la línea de comandos usando aplicaciones como curl, wget, entre otras.

curl cheat.sh/{comando}

Por ejemplo:

curl cheat.sh/sudo

El proyecto además está alojado en Github y aceptan adiciones o correcciones a través de pull requests.

Fuente: CyberHades

#Sysadmineando en Windows – Comandos útiles

Ahora, un poco de comandos útiles, pero, para Windows. Si bien son algo básicos, pretendo que luego sean más avanzados, no dejan de ser una ayuda fundamental en algún troubleshooting. ¡ Espero que les sirvan !

1: System File Checker

Es común que si fuiste infectado por malware éstos intenten reemplazar tus archivos del sistema por archivos maliciosos, tratando de tomar el control de tu máquina. SFC (system file checker) puede ser usado para verificar la integridad de todos los archivos del sistema Windows. El comando para utilizarlo es:

sfc /scannow

2: File Signature Verification

Una forma de verificar la integridad de un sistema es corroborando que todos los archivos estén firmados digitalmente. Esto se puede hacer a través del comando sigverif (Signature Verification). Si bien se lanza desde la línea de comandos, su uso se realiza a través de una interfaz GUI. Su meta es simple, avisar que archivos del sistema se encuentran o no firmados.

sigverif

3: driverquery

Tener instalado drivers que no sean los correctos, puede derivar en varios problemas en el sistema. Si se quiere saber cuáles están instalados, se utiliza el comando driverquery, el cual proveerá información detallada de cada driver que esté siendo utilizado. en caso que se quiera más información, agregar el argumento -v.

driverquery
driverquery -v

4: nslookup

Esta herramienta sirve para verificar que las resoluciones DNS estén funcionando correctamente. Cuando se corre nslookup contra un hostname, la herramienta mostrará como fue resuelto en nombre, así como también que servidor DNS se utilizó durante el lookup. Cabe destacar que es muy útil en casos de troubleshooting relacionados a registros DNS.

 

nslookup dc1.contoso.com

5: Ping

La más conocida y utilizada para diagnóstico. Es utilizada para verificar conexiones TCP/IP de forma básica, utilizando el protocolo ICMP.

ping 192.168.1.1

6: Pathping

Si bien ping hace un buen trabajo notificando cuando dos máquinas pueden comunicarse entre sí a través de TCP/IP, en el caso que no se puedan conectar la salida de error es muy limitada (casi nula). Allí es cuando pathping entra en juego. Ésta herramienta está diseñada para entornos en los que existan uno o más routers entre los hosts. Se envía una serie de paquetes a cada router que se encuentra en el path de destino del host en un esfuerzo para determinar si el router está trabajando lento (problemas con latencia, o lo que sea) o bien, dropeando paquetes.

pathping 192.168.1.1

7: Repair-bde

Si un dispositivo cifrado con BitLocker tiene problemas, a veces se puede recuperar la información utilizando repair-bde. Para utilizarlo, es necesario declarar un dispositivo para poder escribir toda la información recuperada, así como también la key de recuperación o contraseña de BitLocker.

repair-bde <source> <destination> -rk | rp <source>

8: Tasklist

Este comando está diseñado para proveer información sobre las tareas que están corriendo en un sistema Windows.

tasklist

Tiene varias funcionalidades más, las cuales se invocan con argumentos. Por ejemplo, utilizando -m, permite que tasklist muestre todos los módulos DLL asociados a una tarea en particular. Por otro lado, -svc muestra todos los servicios que soportan las tareas.

tasklist -m
tasklist -svc

9: Taskkill

Éste comando es para finalizar tareas, tanto como por nombre como por ID. Su sintaxis es relativamente fácil, tal como se muestra en los siguientes ejemplos.

taskkill -pid 4104
taskkill -im iexplore.exe

Contenido original en inglés, disponible en Tech Republic.

Comandos útiles para quienes migraron a Linux hace poco (II)

Por comentarios y vistas que recibí en la primera parte, creo que es una buena iniciativa seguir el hilo de éstos posts. No solo porque ayudan a quienes vienen de Windows, sino que también me sirven de ayuda-memoria en varios escenarios … En este caso, algunos comandos para verificar la información del CPU.

1. /proc/cpuinfo

Este archivo contiene todo el detalle individual de los núcleos del CPU. Para tener una vista más cómoda, ejecutarlo con lesscat.

$ less /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 23
model name      : Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
stepping        : 10
microcode       : 0xa07
cpu MHz         : 1998.000
cache size      : 2048 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority
bogomips        : 5303.14
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

Cada procesador es listado de forma separada, con todos los detalles que se necesiten; grepeando, se puede saber fácilmente cuántas unidades de procesamiento están activas.

$ cat /proc/cpuinfo | grep processor | wc -l
4

 

Y para saber la cantidad de cores, se puede grepear de la siguiente forma.

$ cat /proc/cpuinfo | grep 'core id'
core id : 0
core id : 2
core id : 1
core id : 3

2. lscpu

Es un comando simple que no requiere ni siquiera argumentos. Devuelve un detalle muy completo de la arquitectura del CPU y sobre todo en un formato amigable.

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1998.000
BogoMIPS:              5303.14
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              2048K
NUMA node0 CPU(s):     0-3

3. hardinfo

Ésta herramienta GUI, basada en GTK, se encarga de generar reportes sobre varios componentes del hardware. En caso de no contar con una interfaz GUI, se puede correr desde la línea de comandos.

$ hardinfo | less

4. lshw

Este comando devuelve información un tanto limitada del CPU. Por defecto, devuelve datos de varias partes del hardware, aunque utilizando el parámetro ‘-class’ se puede obtener información sobre una parte en específica.

The lshw command can display limited information about the cpu. lshw by default shows information about various hardware parts, and the ‘-class’ option can be used to pickup information about a specific hardware part.

$ sudo lshw -class processor
  *-cpu                   
       description: CPU
       product: Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
       vendor: Intel Corp.
       physical id: 0
       bus info: cpu@0
       version: Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
       slot: LGA 775
       size: 1998MHz
       capacity: 4GHz
       width: 64 bits
       clock: 333MHz
       capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx x86-64 constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority cpufreq

5. nproc

Solo devuelve la cantidad de unidades de procesamiento que estén disponibles en el momento. NOTA: éstas unidades de procesamiento no siempre son la misma cantidad de cores.

$ nproc
4

6. dmidecode

Devuelve abundante información sobre el CPU, incluyendo el tipo de socket, fabricante y otros flags.

$ sudo dmidecode -t 4
# dmidecode 2.12
SMBIOS 2.4 present.

Handle 0x0000, DMI type 4, 35 bytes
Processor Information
        Socket Designation: LGA 775
        Type: Central Processor
        Family: Pentium D
        Manufacturer: Intel(R) Corporation
        ID: 7A 06 01 00 FF FB EB BF
        Signature: Type 0, Family 6, Model 23, Stepping 10
        Flags:
                FPU (Floating-point unit on-chip)
                VME (Virtual mode extension)
                DE (Debugging extension)
                PSE (Page size extension)
                TSC (Time stamp counter)
                MSR (Model specific registers)
                PAE (Physical address extension)
                MCE (Machine check exception)
                CX8 (CMPXCHG8 instruction supported)
                APIC (On-chip APIC hardware supported)
                SEP (Fast system call)
                MTRR (Memory type range registers)
                PGE (Page global enable)
                MCA (Machine check architecture)
                CMOV (Conditional move instruction supported)
                PAT (Page attribute table)
                PSE-36 (36-bit page size extension)
                CLFSH (CLFLUSH instruction supported)
                DS (Debug store)
                ACPI (ACPI supported)
                MMX (MMX technology supported)
                FXSR (FXSAVE and FXSTOR instructions supported)
                SSE (Streaming SIMD extensions)
                SSE2 (Streaming SIMD extensions 2)
                SS (Self-snoop)
                HTT (Multi-threading)
                TM (Thermal monitor supported)
                PBE (Pending break enabled)
        Version: Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
        Voltage: 1.6 V
        External Clock: 333 MHz
        Max Speed: 4000 MHz
        Current Speed: 2666 MHz
        Status: Populated, Enabled
        Upgrade: Socket LGA775
        L1 Cache Handle: 0x0003
        L2 Cache Handle: 0x0001
        L3 Cache Handle: Not Provided
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified

Contenido original en inglés: Binary Tides

Comandos útiles para quienes migraron a Linux hace poco

Para todos aquellos que migraron hace poco hacia alguna distribución de Linux, una lista bastante completa de comandos que te pueden ayudar en el día a día.

Comandos Generales

dmesg
Imprime los mensajes desplegados por el “kernel” al inicio.

depmod -a
Genera un archivo que contiene las dependencias de los módulos que son cargados para el “Kernel”, esto es, es capaz de reconocer cuales módulos deben de ser cargados para que un tercero sea utilizado en el sistema.

free
Estadísticas de uso de Memoria.

init q
Comando que vuelve a leer los parámetros que se encuentran en inittab.

insmod
Habilita (“loads”) el modulo que se especifica en la línea, para que el “kernel” sea capaz de utilizarlo. Ejemplo: insmod ip_alias.o

ldconfig
Actualiza las librerías utilizadas por el sistema, recomendable ejecutarlo cada vez que se instale un programa.

Continue reading

Todo lo que trae #iOS11

Durante el día de ayer Apple presentó iOS 11 al mundo en la conferencia para desarrolladores. Dado que habían muchas cosas que presentar, tan sólo nos mostraron las características más importantes. Sin embargo, no son las únicas novedades que tenemos en el nuevo sistema operativo para iPhone y iPad.

Si vas a instalar iOS 11 en tu iPhone o iPad (siempre y cuando sea compatible) debes tener en cuenta aunque además de lo que ya se sabe de la keynote, existen numerosas novedades y características ocultas en el sistema operativo. Hemos recopilado todas aquellas que hemos encontrado hasta el momento.

¿Qué características ocultas tiene iOS 11?

  • Escribirle a Siri: Hasta ahora la única opción para interactuar con Siri era hablando, ahora también puedes escribirle para no sacar ni una sílaba de tu boca y no hacer ningún ruido.
Img 0580

Continue reading

Usando “df” para verificar el espacio libre en nuestro sistema #Linux

El comando df (disk filesystem por sus siglas en Inglés), es utilizado para tener un reporte completo del espacio del disco, indicando espacios libres y usados del mismo, entre otra información importante. A continuación, una serie de parámetros muy útiles para sacarle provecho completo a ésta herramienta nativa:

1. Verificar los espacios de uso del disco

Utilizando solo el comando df, vamos a tener un reporte sobre los nombres de los dispositivos, bloques, espacio usado/libre y puntos montados del sistema.

[root@tecmint ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/cciss/c0d0p2     78361192  23185840  51130588  32% /
/dev/cciss/c0d0p5     24797380  22273432   1243972  95% /home
/dev/cciss/c0d0p3     29753588  25503792   2713984  91% /data
/dev/cciss/c0d0p1       295561     21531    258770   8% /boot
tmpfs                   257476         0    257476   0% /dev/shm

2. Mostrar información de todos los filesystems

Lo mismo que el punto anterior, aunque también muestra información de particiones dummy del sistema (por ejemplo, proc sysfs). Éstas particiones se caracterizan por tener un tamaño de 0 bloques (esto quiere decir que no corresponden a un dispositivo físico, sino que son puramente virtuales). Suelen ser utilizadas para propósitos especiales.

[root@tecmint ~]# df -a
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/cciss/c0d0p2     78361192  23186116  51130312  32% /
proc                         0         0         0   -  /proc
sysfs                        0         0         0   -  /sys
devpts                       0         0         0   -  /dev/pts
/dev/cciss/c0d0p5     24797380  22273432   1243972  95% /home
/dev/cciss/c0d0p3     29753588  25503792   2713984  91% /data
/dev/cciss/c0d0p1       295561     21531    258770   8% /boot
tmpfs                   257476         0    257476   0% /dev/shm
none                         0         0         0   -  /proc/sys/fs/binfmt_misc
sunrpc                       0         0         0   -  /var/lib/nfs/rpc_pipefs

Continue reading