mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/ios-pentesting/ios-pentesting-without
This commit is contained in:
parent
813f612518
commit
29c75b1acd
@ -6,9 +6,9 @@
|
||||
|
||||
Programu zilizosainiwa na **entitlement `get_task_allow`** zinawaruhusu programu za upande wa tatu kuendesha kazi inayoitwa **`task_for_pid()`** na kitambulisho cha mchakato wa programu ya awali kama hoja ili kupata bandari ya kazi juu yake (kuwa na uwezo wa kuidhibiti na kufikia kumbukumbu yake).
|
||||
|
||||
Hata hivyo, si rahisi kama tu kuvuta IPA, kuisaini tena na entitlement, na kuirudisha kwenye kifaa chako. Hii ni kwa sababu ya ulinzi wa FairPlay. Wakati saini ya programu inabadilika, funguo za DRM (Usimamizi wa Haki za Kidijitali) **zinabatilishwa na programu haitafanya kazi**.
|
||||
Hata hivyo, si rahisi kama tu kuvuta IPA, kuisaini tena na entitlement, na kuirudisha kwenye kifaa chako. Hii ni kwa sababu ya ulinzi wa FairPlay. Wakati saini ya programu inabadilika, funguo za DRM (Digital Rights Management) **zinabatilishwa na programu haitafanya kazi**.
|
||||
|
||||
Kwa kifaa cha zamani kilichovunjwa, inawezekana kufunga IPA, **kuikodisha kwa kutumia chombo unachokipenda** (kama Iridium au frida-ios-dump), na kuirudisha kutoka kwenye kifaa. Ingawa, ikiwa inawezekana, inapendekezwa kuwasiliana na mteja kwa IPA iliyokodishwa.
|
||||
Kwa kifaa cha zamani kilichovunjwa, inawezekana kufunga IPA, **kuikodisha kwa kutumia chombo unachokipenda** (kama Iridium au frida-ios-dump), na kuirudisha kutoka kwenye kifaa. Ingawa, ikiwa inawezekana, inapendekezwa kuomba tu kwa mteja kwa IPA iliyokodishwa.
|
||||
|
||||
## Pata IPA iliyokodishwa
|
||||
|
||||
@ -18,16 +18,16 @@ Kwa kifaa cha zamani kilichovunjwa, inawezekana kufunga IPA, **kuikodisha kwa ku
|
||||
2. Funga na uzindue [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) ndani ya macos yako
|
||||
3. Fungua `Terminal` kwenye Mac yako, na cd hadi `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. IPA itaonekana katika folda hii baadaye.
|
||||
4. Unapaswa kuona kifaa chako cha iOS. Bonyeza mara mbili juu yake, kisha bonyeza Ongeza + → Programu kutoka kwenye menyu ya juu.
|
||||
5. Baada ya kubonyeza Ongeza, Configurator itashusha IPA kutoka Apple, na kujaribu kuisukuma kwenye kifaa chako. Ikiwa ulifuata mapendekezo yangu awali na tayari umefunga IPA, ujumbe wa kukuuliza ufungue programu tena utaonekana.
|
||||
5. Baada ya kubonyeza Ongeza, Configurator itashusha IPA kutoka Apple, na kujaribu kuisukuma kwenye kifaa chako. Ikiwa ulifuata mapendekezo yangu awali na kufunga IPA tayari, ujumbe wa kukuuliza ufungue programu tena utaonekana.
|
||||
6. IPA inapaswa kushushwa ndani ya `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` ambapo unaweza kuichukua.
|
||||
|
||||
Angalia [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) kwa maelezo zaidi kuhusu mchakato huu.
|
||||
|
||||
### Kuikodisha programu
|
||||
|
||||
Ili kuikodisha IPA tunakwenda kuifunga. Hata hivyo, ikiwa una iPhone ya zamani iliyovunjwa, huenda toleo lake halitaungwa mkono na programu kwani kawaida programu zinasaidia tu matoleo ya hivi karibuni.
|
||||
Ili kuikodisha IPA tunakwenda kuifunga. Hata hivyo, ikiwa una iPhone ya zamani iliyovunjwa, huenda toleo lake halitasaidiwa na programu kwani kawaida programu zinasaidia tu matoleo ya hivi karibuni.
|
||||
|
||||
Hivyo, ili kuifunga, fungua IPA:
|
||||
Hivyo, ili kuifunga, fungua tu IPA:
|
||||
```bash
|
||||
unzip redacted.ipa -d unzipped
|
||||
```
|
||||
@ -49,7 +49,7 @@ Once intalled, you can use **Iridium tweak** from Cydia in order to obtain the d
|
||||
|
||||
### Patch entitlements & re-sign
|
||||
|
||||
Ili ku-sign upya programu na `get-task-allow` entitlement kuna zana kadhaa zinazopatikana kama `app-signer`, `codesign`, na `iResign`. `app-signer` ina kiolesura rafiki cha mtumiaji ambacho kinaruhusu ku-sign upya faili ya IPA kwa urahisi kwa kuashiria IPA ya ku-sign upya, kuweka `get-taks-allow` na cheti na profaili ya usambazaji ya kutumia.
|
||||
Ili kusaini upya programu na `get-task-allow` entitlement kuna zana kadhaa zinazopatikana kama `app-signer`, `codesign`, na `iResign`. `app-signer` ina kiolesura rafiki cha mtumiaji ambacho kinaruhusu kusaini kwa urahisi faili la IPA kwa kuashiria IPA ya kusaini upya, kuweka `get-taks-allow` na cheti na profaili ya usambazaji ya kutumia.
|
||||
|
||||
Kuhusu cheti na profaili za kusaini, Apple inatoa **free developer signing profiles** kwa akaunti zote kupitia Xcode. Unda tu programu na uipange. Kisha, panga **iPhone kuamini programu za developer** kwa kuingia kwenye `Settings` → `Privacy & Security`, na bonyeza `Developer Mode`.
|
||||
|
||||
@ -59,15 +59,15 @@ ideviceinstaller -i resigned.ipa -w
|
||||
```
|
||||
---
|
||||
|
||||
### Wezesha Hali ya Mwandamizi (iOS 16+)
|
||||
### Wezesha Hali ya Mwandishi (iOS 16+)
|
||||
|
||||
Tangu iOS 16 Apple ilianzisha **Hali ya Mwandamizi**: binary yoyote inayobeba `get_task_allow` *au* iliyosainiwa na cheti cha maendeleo itakataa kuanzishwa hadi Hali ya Mwandamizi iwezeshwe kwenye kifaa. Hutaweza pia kuunganisha Frida/LLDB isipokuwa bendera hii iwepo.
|
||||
Tangu iOS 16 Apple ilianzisha **Hali ya Mwandishi**: binary yoyote inayobeba `get_task_allow` *au* iliyosainiwa na cheti cha maendeleo itakataa kuanzishwa hadi Hali ya Mwandishi iwezeshwe kwenye kifaa. Hutaweza pia kuunganisha Frida/LLDB isipokuwa bendera hii iwepo.
|
||||
|
||||
1. Sakinisha au sukuma **yoyote** IPA iliyosainiwa na mwandamizi kwenye simu.
|
||||
2. Nenda kwenye **Mipangilio → Faragha & Usalama → Hali ya Mwandamizi** na iwashe.
|
||||
3. Kifaa kitaanzisha upya; baada ya kuingiza nambari ya siri utaulizwa **Washa** Hali ya Mwandamizi.
|
||||
1. Sakinisha au sukuma **yoyote** IPA iliyosainiwa na mwandishi kwenye simu.
|
||||
2. Nenda kwenye **Mipangilio → Faragha & Usalama → Hali ya Mwandishi** na iwashe.
|
||||
3. Kifaa kitaanzisha upya; baada ya kuingiza nambari ya siri utaulizwa **Washa** Hali ya Mwandishi.
|
||||
|
||||
Hali ya Mwandamizi inabaki hai hadi uizime au kufuta simu, hivyo hatua hii inahitaji kufanywa mara moja kwa kifaa. [Apple documentation](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) inaelezea athari za usalama.
|
||||
Hali ya Mwandishi inabaki hai hadi uizime au kufuta simu, hivyo hatua hii inahitaji kufanywa mara moja kwa kifaa. [Hati za Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) zinaelezea athari za usalama.
|
||||
|
||||
### Chaguzi za kisasa za sideloading
|
||||
|
||||
@ -75,14 +75,14 @@ Sasa kuna njia kadhaa za kisasa za sideloading na kuweka IPAs zilizosainiwa up-t
|
||||
|
||||
| Chombo | Mahitaji | Nguvu | Mipaka |
|
||||
|--------|----------|-------|--------|
|
||||
| **AltStore 2 / SideStore** | macOS/Windows/Linux mwenzi anayesaini tena IPA kila siku 7 kwa profaili ya bure ya maendeleo | Upakuaji wa moja kwa moja kupitia Wi-Fi, inafanya kazi hadi iOS 17 | Inahitaji kompyuta kwenye mtandao mmoja, kikomo cha programu 3 kilichowekwa na Apple |
|
||||
| **TrollStore 1/2** | Kifaa kwenye iOS 14 – 15.4.1 kilichokuwa na udhaifu wa CoreTrust | *Saini ya kudumu* (hakuna kikomo cha siku 7); hakuna kompyuta inahitajika mara baada ya kusakinishwa | Haipatikani kwenye iOS 15.5+ (bug ilirekebishwa) |
|
||||
| **AltStore 2 / SideStore** | msaidizi wa macOS/Windows/Linux anayesaini tena IPA kila siku 7 kwa profaili ya bure ya maendeleo | Upakuaji wa moja kwa moja kupitia Wi-Fi, inafanya kazi hadi iOS 17 | Inahitaji kompyuta kwenye mtandao mmoja, kikomo cha programu 3 kilichowekwa na Apple |
|
||||
| **TrollStore 1/2** | Kifaa kwenye iOS 14 – 15.4.1 kilicho hatarini kwa hitilafu ya CoreTrust | *Saini ya kudumu* (hakuna kikomo cha siku 7); hakuna kompyuta inahitajika mara baada ya kusakinishwa | Haipatikani kwenye iOS 15.5+ (hitilafu imefanyiwa marekebisho) |
|
||||
|
||||
Kwa pentests za kawaida kwenye toleo la sasa la iOS, Alt/Side-Store mara nyingi ni chaguo bora zaidi.
|
||||
|
||||
### Hooking / uhandisi wa dynamic
|
||||
|
||||
Unaweza kuunganisha programu yako kama ilivyo kwenye kifaa kilichofungwa mara tu inaposainiwa na `get_task_allow` **na** Hali ya Mwandamizi ikiwa wazi:
|
||||
Unaweza kuhook programu yako kama ilivyo kwenye kifaa kilichofungwa mara tu inapokuwa imesainiwa na `get_task_allow` **na** Hali ya Mwandishi ikiwa wazi:
|
||||
```bash
|
||||
# Spawn & attach with objection
|
||||
objection -g "com.example.target" explore
|
||||
@ -94,7 +94,7 @@ Recent Frida releases (>=16) automatically handle pointer authentication and oth
|
||||
|
||||
### Automated dynamic analysis with MobSF (no jailbreak)
|
||||
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) inaweza kuingiza IPA iliyoandikwa na developer kwenye kifaa halisi kwa kutumia mbinu ile ile (`get_task_allow`) na inatoa UI ya wavuti yenye kivinjari cha mfumo wa faili, kukamata trafiki na console ya Frida【】. Njia ya haraka ni kuendesha MobSF kwenye Docker kisha kuunganisha iPhone yako kupitia USB:
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) inaweza kuingiza IPA iliyosainiwa na mende kwenye kifaa halisi kwa kutumia mbinu ile ile (`get_task_allow`) na inatoa UI ya wavuti yenye kivinjari cha mfumo wa faili, kukamata trafiki na console ya Frida【†L2-L3】. Njia ya haraka ni kuendesha MobSF kwenye Docker na kisha kuunganisha iPhone yako kupitia USB:
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
||||
docker run -p 8000:8000 --privileged \
|
||||
@ -104,15 +104,15 @@ opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
MobSF itapeleka kiotomatiki binary, iwezeshe seva ya Frida ndani ya sandbox ya programu na kuunda ripoti ya mwingiliano.
|
||||
|
||||
### iOS 17 & Kikwazo cha Modu ya Lockdown
|
||||
### iOS 17 & Kikwazo cha Modu ya Kufunga
|
||||
|
||||
* **Modu ya Lockdown** (Mipangilio → Faragha & Usalama) inazuia linker ya dynamic kupakia maktaba za dynamic zisizo na saini au zilizotiwa saini na nje. Unapojaribu vifaa ambavyo vinaweza kuwa na modhi hii imewezeshwa hakikisha ime **zimwa** au vikao vyako vya Frida/objection vitakatishwa mara moja.
|
||||
* Uthibitishaji wa Pointer (PAC) unatekelezwa kwa mfumo mzima kwenye vifaa vya A12+. Frida ≥16 inashughulikia PAC stripping kwa uwazi — hakikisha unashikilia *frida-server* na zana za Python/CLI zikiwa za kisasa kila wakati toleo jipya kuu la iOS linapotolewa.
|
||||
* **Modu ya Kufunga** (Mipangilio → Faragha & Usalama) inazuia linker ya dinamik kutoka kupakia maktaba za dinamik zisizosainiwa au zilizotiwa saini na nje. Unapojaribu vifaa ambavyo vinaweza kuwa na modhi hii iliyoanzishwa hakikisha ime **zimwa** au vikao vyako vya Frida/objection vitakatishwa mara moja.
|
||||
* Uthibitishaji wa Kidokezo (PAC) unatekelezwa kwa mfumo mzima kwenye vifaa vya A12+. Frida ≥16 inashughulikia PAC stripping kwa uwazi — hakikisha unashikilia *frida-server* na zana za Python/CLI zikiwa za kisasa kila wakati toleo jipya kuu la iOS linapotolewa.
|
||||
|
||||
## Marejeo
|
||||
## Marejeleo
|
||||
|
||||
- [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)
|
||||
- Hati za maendeleo za Apple – Kuwawezesha Modu ya Developer kwenye kifaa: <https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device>
|
||||
- Hati za maendeleo za Apple – Kuanzisha Modu ya Mende kwenye kifaa: <https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device>
|
||||
- Mfumo wa Usalama wa Simu (MobSF): <https://mobsf.github.io/Mobile-Security-Framework-MobSF/>
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,6 +2,99 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Angalia posti [https://portswigger.net/research/http-2-downgrades](https://portswigger.net/research/http-2-downgrades)**
|
||||
HTTP/2 kwa ujumla inachukuliwa kuwa haina hatari kwa request-smuggling ya jadi kwa sababu urefu wa kila DATA frame ni wazi. **Ulinzi huo unakosekana mara tu proxy ya mbele “inaporomosha” ombi hilo hadi HTTP/1.x kabla ya kulipeleka kwa nyuma**. Wakati parser mbili tofauti (HTTP/2 front-end na HTTP/1 back-end) zinapojaribu kukubaliana juu ya mahali ambapo ombi moja linamalizika na lingine linaanza, hila zote za zamani za desync zinarejea – pamoja na chache mpya.
|
||||
|
||||
---
|
||||
## Kwa nini kuporomoka kunatokea
|
||||
|
||||
1. Vivinjari tayari vinazungumza HTTP/2, lakini miundombinu ya zamani ya asili bado inelewa tu HTTP/1.1.
|
||||
2. Reverse-proxies (CDNs, WAFs, load-balancers) kwa hivyo huweka mwisho TLS + HTTP/2 kwenye ukingo na **kuandika upya kila ombi kama HTTP/1.1** kwa asili.
|
||||
3. Hatua ya tafsiri inahitaji kuunda *zote* `Content-Length` **na/au** `Transfer-Encoding: chunked` vichwa ili asili iweze kubaini urefu wa mwili.
|
||||
|
||||
Wakati wowote front-end inatilia maanani urefu wa frame ya HTTP/2 **lakini** back-end inatilia maanani CL au TE, mshambuliaji anaweza kuwafanya wasikubaliane.
|
||||
|
||||
---
|
||||
## Daraja mbili kuu za primitive
|
||||
|
||||
| Variant | Front-end length | Back-end length | Typical payload |
|
||||
|---------|-----------------|-----------------|-----------------|
|
||||
| **H2.TE** | HTTP/2 frame | `Transfer-Encoding: chunked` | Weka ujumbe wa mwili wa chunked wa ziada ambao `0\r\n\r\n` wa mwisho haujatumwa, hivyo back-end inasubiri ombi la “next” lililotolewa na mshambuliaji. |
|
||||
| **H2.CL** | HTTP/2 frame | `Content-Length` | Tuma *ndogo* CL kuliko mwili halisi, hivyo back-end inasoma zaidi ya mpaka katika ombi linalofuata. |
|
||||
|
||||
> Hizi ni sawa kwa roho na TE.CL / CL.TE za jadi, tu na HTTP/2 ikichukua nafasi ya mmoja wa waandishi.
|
||||
|
||||
---
|
||||
## Kutambua mchain ya kuporomoka
|
||||
|
||||
1. Tumia **ALPN** katika handshake ya TLS (`openssl s_client -alpn h2 -connect host:443`) au **curl**:
|
||||
```bash
|
||||
curl -v --http2 https://target
|
||||
```
|
||||
Ikiwa `* Using HTTP2` inaonekana, ukingo unazungumza H2.
|
||||
2. Tuma ombi la CL/TE lililokusudiwa vibaya *kupitia* HTTP/2 (Burp Repeater sasa ina dropdown ya kulazimisha HTTP/2). Ikiwa jibu ni kosa la HTTP/1.1 kama `400 Bad chunk`, una uthibitisho kwamba ukingo umebadilisha trafiki kwa parser ya HTTP/1 chini.
|
||||
|
||||
---
|
||||
## Mchakato wa unyakuzi (mfano wa H2.TE)
|
||||
```http
|
||||
:method: POST
|
||||
:path: /login
|
||||
:scheme: https
|
||||
:authority: example.com
|
||||
content-length: 13 # ignored by the edge
|
||||
transfer-encoding: chunked
|
||||
|
||||
5;ext=1\r\nHELLO\r\n
|
||||
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
|
||||
```
|
||||
1. **Front-end** inasoma byte 13 tu (`HELLO\r\n0\r\n\r\nGE`), inadhani ombi limekamilika na kupeleka kiasi hicho kwa asili.
|
||||
2. **Back-end** inategemea kichwa cha TE, inaendelea kusoma hadi inapoona *ya pili* `0\r\n\r\n`, hivyo inatumia prefix ya ombi la pili la mshambuliaji (`GET /admin …`).
|
||||
3. Kiasi kilichobaki (`GET /admin …`) kinachukuliwa kama ombi *jipya* lililoorodheshwa nyuma ya la mwathirika.
|
||||
|
||||
Badilisha ombi lililofichwa na:
|
||||
* `POST /api/logout` kulazimisha kurekebisha kikao
|
||||
* `GET /users/1234` kuiba rasilimali maalum ya mwathirika
|
||||
|
||||
---
|
||||
## h2c smuggling (mabadiliko ya wazi)
|
||||
|
||||
Utafiti wa mwaka 2023 ulibaini kwamba ikiwa front-end inapita kichwa cha HTTP/1.1 `Upgrade: h2c` kwa back-end inayounga mkono HTTP/2 ya wazi, mshambuliaji anaweza kupitisha *raw* HTTP/2 frames kupitia edge ambayo ilithibitisha tu HTTP/1.1. Hii inakwepa kawaida ya kichwa, sheria za WAF na hata kumaliza TLS.
|
||||
|
||||
Mahitaji muhimu:
|
||||
* Edge inapeleka **zote** `Connection: Upgrade` na `Upgrade: h2c` bila kubadilishwa.
|
||||
* Asili inaongeza kwa HTTP/2 na inashikilia semantics za kurejelea muunganisho ambazo zinawezesha kuorodhesha maombi.
|
||||
|
||||
Kuzuia ni rahisi – ondoa au uweke kichwa cha `Upgrade` kwa edge isipokuwa kwa WebSockets.
|
||||
|
||||
---
|
||||
## CVEs za kutambulika katika ulimwengu halisi (2022-2025)
|
||||
|
||||
* **CVE-2023-25690** – Sheria za mod_proxy za Apache HTTP Server zinaweza kuunganishwa kwa ajili ya kugawanya na kuficha maombi. (imekamilishwa katika 2.4.56)
|
||||
* **CVE-2023-25950** – HAProxy 2.7/2.6 kuficha maombi/jibu wakati parser ya HTX iliposhughulikia vibaya maombi yaliyoandikwa kwa mfululizo.
|
||||
* **CVE-2022-41721** – Go `MaxBytesHandler` ilisababisha byte za mwili zilizobaki kuchambuliwa kama **HTTP/2** frames, ikiruhusu kuficha kwa njia ya itifaki tofauti.
|
||||
|
||||
---
|
||||
## Zana
|
||||
|
||||
* **Burp Request Smuggler** – tangu v1.26 inajaribu kiotomatiki H2.TE/H2.CL na msaada wa ALPN uliofichwa. Wezesha “HTTP/2 probing” katika chaguzi za nyongeza.
|
||||
* **h2cSmuggler** – Python PoC na Bishop Fox ili kuendesha shambulio la mabadiliko ya wazi:
|
||||
```bash
|
||||
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
|
||||
```
|
||||
* **curl**/`hyper` – kuunda payloads za mikono: `curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target`.
|
||||
|
||||
---
|
||||
## Hatua za kujihami
|
||||
|
||||
1. **HTTP/2 kutoka mwisho hadi mwisho** – ondolea kabisa tafsiri ya kudondosha.
|
||||
2. **Chanzo kimoja cha ukweli wa urefu** – unaposhuka, *daima* tengeneza `Content-Length` halali **na** **ondoa** kichwa chochote kilichotolewa na mtumiaji `Content-Length`/`Transfer-Encoding`.
|
||||
3. **Sanitiza kabla ya njia** – tumia usafi wa kichwa *kabla* ya mantiki ya kuelekeza/kurekebisha.
|
||||
4. **Kutengwa kwa muunganisho** – usitumie muunganisho wa TCP wa back-end kati ya watumiaji; “ombio moja kwa muunganisho” inashinda unyanyasaji wa msingi wa orodha.
|
||||
5. **Ondoa `Upgrade` isipokuwa WebSocket** – inazuia h2c tunnelling.
|
||||
|
||||
---
|
||||
## Marejeleo
|
||||
|
||||
* PortSwigger Research – “HTTP/2: The Sequel is Always Worse” <https://portswigger.net/research/http2>
|
||||
* Bishop Fox – “h2c Smuggling: request smuggling via HTTP/2 clear-text” <https://bishopfox.com/blog/h2c-smuggling-request>
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user