While you don't give the necessary details in your question, I decided to give it a go with the R6250-V1.0.4.26_10.1.23.zip from the Netgear website. I don't know how close that is to whatever target you are currently looking at, but the environment look superficially rather similar (especially contents of /etc).
First I used firmware-mod-kit to extract the .chk file inside the downloaded .zip:
$ extract-firmware.sh R6250-V1.0.4.26_10.1.23.chk
Firmware Mod Kit (extract) 0.99, (c)2011-2013 Craig Heffner, Jeremy Collake
Scanning firmware...
Scan Time: 2018-06-13 17:23:43
Target File: /home/user/netgear/R6250-V1.0.4.26_10.1.23.chk
MD5 Checksum: fbb0ddc095cbca7abebe90a19a1b39b7
Signatures: 344
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
58 0x3A TRX firmware header, little endian, image size: 19345408 bytes, CRC32: 0xE9FDE7D3, flags: 0x0, version: 1, header size: 28 bytes, loader offset: 0x1C, linux kernel offset: 0x23F01C, rootfs offset: 0x0
86 0x56 LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 5467936 bytes
2355286 0x23F056 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 16983563 bytes, 1244 inodes, blocksize: 131072 bytes, created: 2018-04-02 13:08:38
Extracting 2355286 bytes of header image at offset 0
Extracting squashfs file system at offset 2355286
Extracting squashfs files...
Firmware extraction successful!
Firmware parts can be found in '/home/user/netgear/fmk/*'
Then I started to explore the contents of fmk/rootfs using standard Linux tools. For example only a single .cgi file existed in the whole rootfs.
$ find -name '*.cgi'
./www/cgi-bin/genie.cgi
With grep -R \.cgi www I was able to find a whole bunch of references to different "files" named .cgi used inside forms of the router's web interface.
I then attempted to filter down the list a little further (inside fmk/rootfs/www):
grep -RPho '[^"]+\.cgi'|sort -u
There were some outliers in the resulting list, but the outcome was useful nevertheless.
Armed with that knowledge I turned back to the rootfs in order to look for the web server. I could have used find -name httpd, as it turns out, but in reality I was looking through /bin, /usr/bin and /usr/sbin in that order and found a binary named httpd in the last one.
Using strings httpd from inside fmk/rootfs/usr/sbin gave me further clues and definitely proved that this was no Nginx or Apache. With strings httpd|grep \.cgi I was also able to verify that the quote:
apply.cgi is not really a script, but a function that is invoked in the HTTP server
appears to hold true.
Using readelf -d httpd I figured out the dependencies (excerpt):
$ readelf -d httpd
Dynamic section at offset 0xae00c contains 31 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libnat.so]
0x00000001 (NEEDED) Shared library: [libnvram.so]
0x00000001 (NEEDED) Shared library: [libacos_shared.so]
0x00000001 (NEEDED) Shared library: [libcrypt.so.0]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libssl.so.1.0.0]
0x00000001 (NEEDED) Shared library: [libcrypto.so.1.0.0]
0x00000001 (NEEDED) Shared library: [libc.so.0]
to know which libraries to look at, should the need come up.
Last but not least I loaded the ELF file httpd into IDA Pro 7.1, turned to the Strings subview using Shift+F12 and started looking for the .cgi names. The apply.cgi you mentioned does not exist (verified by using strings on httpd and grep -R apply\.cgi fmk/rootfs/www). So I needed to pick another CGI as an example.
I went for userlogin.cgi, which was one of the first names to come up when searching for text .cgi from top down using Alt+T in IDA View-A.
Listing the cross-references (x) to the string containing userlogin.cgi:
.rodata:000823DC aUserloginCgi DCB "userlogin.cgi",0
turned up several references to sub_F110 (.text:0000F110...text:0001289C), which - when following these cross-references - turned out to be one central "mega-function" for parsing HTTP requests and handling the requests to any number of hardcoded .cgi and .htm "file names". (NB: make sure to look for references to strings containing cgi-bin as well.)
So your suspicion, based on that quote, was true and with the sole exception of the genie.cgi found on the file system, all other .cgi "files" are handled directly by the massive 1.3 MiB httpd binary.
The binary contains strings aplenty and apparently even some assertion strings among them.
grep -RPho '[^"]+\.cgi'|sort -ugives me 162 distinct mentions of files "named".cgiwhereas only a singlegenie.cgiexists in the overall rootfs./usr/sbin/httpdlooks like a treasure trove of strings. It's not an Apache, though. Looks more like homebrew. And guess what, a whole bunch of the.cginames mentioned also in the HTML files inside/www. So you're in luck. – 0xC0000022L Jun 13 '18 at 15:25